1、問題背景
最近測試庫查詢一個(gè)表的數(shù)據(jù),需要用到唯一的一個(gè)日期類型字段作為 where 的子查詢(查詢當(dāng)天的數(shù)據(jù)),就正常寫了個(gè)這樣的 SQL,具體的表名我就不寫了:
# create_time 是 datetime 類型
select * from ${tablename} where date(create_time)='20220919' limit 20;
其中字段的值樣本如下:
我知道我寫的這條 SQL 即使在 create_time 這個(gè)列有索引的情況下也不會走索引,但是執(zhí)行了以后就 wc 了:
NM!20條記錄你查詢需要 8 s!
這種問題要不優(yōu)化都不敢說自己是農(nóng)民工!
2、優(yōu)化過程
1) 操作索引
首先我看了下這個(gè)表的索引:
show index from ${tablename};
一看,尼瑪,有一個(gè)列對應(yīng)了 2 個(gè)索引字段,也就是 create_time 沒有索引,我就干掉其中一個(gè)重復(fù)的并在 create_time 上建了一個(gè)(表名我就不寫了):
#刪除索引
drop index index_create_time on ${tablename};
#添加索引
create index index_create_time on {tablename}(create_time);
2)是否走索引判斷
有索引了關(guān)鍵是得讓它走索引啊,先驗(yàn)證一下,我用執(zhí)行計(jì)劃繼續(xù)執(zhí)行了上面問題背景中的那個(gè)sql:
explain select * from ${tablename} where date(create_time)='20220919' limit 20;
結(jié)果如下,一點(diǎn)都不意外,照樣全表掃描:
3)datetime使用索引查詢
既然不能操作索引列,我又想查詢某一天的數(shù)據(jù),就只能用范圍了,范圍的就那個(gè)幾個(gè),between…and 、> 、<
于是,我寫了下面查詢 SQL:
select * from ${tablename} where create_time between '2022-09-19 00:00:00' and '2022-09-19 23:59:59';
果然不辜負(fù)我的小操作,查詢結(jié)果如下:
查詢 1850 條數(shù)據(jù)平均在 0.5 s,這不用說,絕壁走了索引,一個(gè)查詢 20 條花費(fèi) 8s,一個(gè)小 2 千記錄花費(fèi)半秒,沒有可比性。文章來源:http://www.zghlxwxcb.cn/news/detail-401734.html
下面驗(yàn)證這個(gè)查詢,同樣在 sql 前加上 explain 后執(zhí)行:
沒毛病,索引類型 range,between…and 走的就是這種范圍索引,這種范圍類型的索引結(jié)構(gòu)開銷是有點(diǎn)大的,大到一定程度就不走索引了,比如在性別字段上建索引!文章來源地址http://www.zghlxwxcb.cn/news/detail-401734.html
到了這里,關(guān)于mysql的datetime字段建立索引并比較大小的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!