近期在做一個報表監(jiān)控的項目带斑,主要的查詢條件就是時間,每天導入數(shù)據(jù)庫的數(shù)據(jù)大概幾萬條,頁面的查詢范圍最多限制在1個月光酣,算下來1個月的數(shù)據(jù)量最多有300w,功能開發(fā)完后自己做了100多萬的測試數(shù)據(jù)脉课,并在作為查詢條件的時間字段上加了索引救军,但是測試時發(fā)現(xiàn)并不是每次用時間范圍查詢的時候都會走索引。
表結構:
CREATE TABLE vehicle_revision_redelivered
(
id
bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
thermosphere
varchar(45) DEFAULT NULL COMMENT '溫層',
order_submit_time
datetime DEFAULT NULL COMMENT '下單時間',
collect_service
varchar(45) DEFAULT NULL COMMENT '攬收服務',
delivery_service
varchar(45) DEFAULT NULL COMMENT '派送服務',
expect_pickup_start_time
datetime DEFAULT NULL COMMENT '預計攬件起始時間',
expect_pickup_end_time
datetime DEFAULT NULL COMMENT '預計攬件結束時間',
expect_delivered_time
datetime DEFAULT NULL COMMENT '應妥投時間時間',
sys_redelivered_time
datetime DEFAULT NULL COMMENT '系統(tǒng)操作再投時間',
create_time
datetime DEFAULT NULL COMMENT '創(chuàng)建時間',
create_pin
varchar(45) DEFAULT NULL COMMENT '創(chuàng)建人賬號',
PRIMARY KEY (id
),
KEY idx_expect_delivered_time
(expect_delivered_time
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
測試數(shù)據(jù)量:1151136 條數(shù)據(jù)
查詢語句SQL1:
explain
SELECT create_time
FROM vehicle_revision_redelivered
where expect_delivered_time >= '2019-10-15 00:00:00' and expect_delivered_time<= '2019-10-30 23:59:59' ;
打印結果 Result1:
查詢語句SQL2:
explain
SELECT create_time
FROM vehicle_revision_redelivered
where expect_delivered_time >= '2019-11-21 00:00:00' and expect_delivered_time<= '2020-01-30 23:59:59' ;
打印結果 Result2:
同樣的sql 不同的只是查詢范圍不同 第一走的全表掃描倘零,第二個走的索引
分析了一下唱遭,總數(shù)據(jù)量一共是1151136 條 ,10月15至10月30號數(shù)據(jù)量是290644條 占總數(shù)量的25.2% 视事,掃描行數(shù)1004564胆萧,11月21號至2020年1月30號數(shù)據(jù)量是106967,約占總數(shù)量的9.3% 掃描行數(shù)401360行, 數(shù)據(jù)主要集中在10月22至11月30號 俐东,這段時間的數(shù)據(jù)一共1091903條
查詢語句SQL3:
explain
SELECT create_time
FROM vehicle_revision_redelivered
where expect_delivered_time >= '2019-11-20 00:00:00' and expect_delivered_time<= '2020-01-30 23:59:59' ;
查詢結果Result3:
11月20至1月30號的數(shù)據(jù)一共142514 占總數(shù)據(jù)量的12.3%,掃描行數(shù)1004564
查詢語句SQL4:
explain
SELECT create_time
FROM vehicle_revision_redelivered
where expect_delivered_time >= '2019-11-20 00:00:00' and expect_delivered_time<= '2020-01-23 23:59:59' ;
查詢結果Result4:
11月20號至1月23號的數(shù)據(jù)一共135789條 約占總數(shù)據(jù)量的 11.8%订晌,掃描行數(shù)426220行
當使用MySql 非主鍵索引進行查詢時 如果掃描數(shù)據(jù)量接近全表數(shù)據(jù)量時虏辫,mysql會進行全表掃描不會使用索引(主鍵索引除外),這也是為什么不建議在區(qū)分度低的字段
上建索引锈拨,也會導致全表掃描砌庄。
rows不能直接理解為掃描行數(shù), 表示MySQL根據(jù)表統(tǒng)計信息及索引選用情況奕枢,估算的找到所需的記錄所需要讀取的行數(shù)也就是mysql認為必須要逐行去檢查和判斷的記錄的條數(shù)娄昆,實際是mysql根據(jù)估算的所需讀取的行數(shù)決定是全表掃描還是使用索引