mysql datetime month不走索引_like百分号加前面一定不走索引吗?一不小心就翻车,关于mysql索引那些容易错的点...
like百分號(hào)加前面一定不走索引嗎?
正常來(lái)講,我們都知道在mysql的like查詢(xún)中,百分號(hào)加在關(guān)鍵詞后面是走索引的,比如 select * like "張三%",而百分號(hào)在前面是不走索引的,比如 select * like "%張三",但也有例外。如果你的字段有id,a,b,c四列。而你對(duì)abc三列加了索引的話(huà)。那無(wú)論如何,like都會(huì)走索引的。因?yàn)槿绻茏吒采w索引的話(huà)。mysql會(huì)優(yōu)先走覆蓋索引。
同時(shí),如果id,a,b,c四列,僅對(duì)a列做了索引,select a from table where a like "%張三%"也同樣是會(huì)走覆蓋索引的
like如果走了索引,或者范圍查詢(xún)后面的字段還走不走索引?
假設(shè)abc加了索引,select a from table where a like "張三%" and b = 18,那b走不走索引?不一定,根據(jù)索引的底層原理,a字段是確定值,b字段才會(huì)走索引。所以范圍查詢(xún)后面不走索引只是一個(gè)偷懶的說(shuō)法。如果范圍查詢(xún)過(guò)后的a是個(gè)確定值,那后面還是走索引的,否則不走
abc創(chuàng)建了索引,where條件和索引順序不一致走不走索引?
abc創(chuàng)建了索引,select * from table where a = 1 and c = 3 and b = 2 走不走索引?走的,mysql底層會(huì)針對(duì)sql語(yǔ)句進(jìn)行一定的優(yōu)化。該sql幾個(gè)and的順序調(diào)整對(duì)最終結(jié)果的正確性沒(méi)有影響,但卻會(huì)走不走索引的查詢(xún)效率影響較大。sql很樂(lè)意做這樣的優(yōu)化
or走不走索引?
我們經(jīng)常會(huì)聽(tīng)到or走索引,或者or不走索引的簡(jiǎn)單說(shuō)法,其實(shí)這里是分情況的
如果針對(duì)某個(gè)字段的or是走索引的,比如 select * from table where ( a = '3' or a = '4') ;
如果針對(duì)多個(gè)字段的or是不走索引的,比如 select * from table where ( a = '3' or b = 4) ;
排序走不走索引?
select * from table where a = '張三' and b = 18 order by c asc,排序字段c走不走索引?走的!
abc正好順序的出現(xiàn)在組合索引當(dāng)中,但有個(gè)點(diǎn)要注意的是,如何知道排序走沒(méi)走索引。一般走沒(méi)走索引通過(guò)explain當(dāng)中的key能看出來(lái)。但在剛才的sql中,由于a已經(jīng)走了索引,c走不走索引無(wú)法通過(guò)key看出來(lái),而只能通過(guò)extra中的信息來(lái)看,如果extra出現(xiàn)了filesort說(shuō)明沒(méi)有用到索引。
引申一下,和c的場(chǎng)景類(lèi)似,如果知道b走沒(méi)有索引。只能通過(guò)和單獨(dú)a條件,比較key_len來(lái)確定,如果b走了索引,key_len是會(huì)變長(zhǎng)的。否則沒(méi)走
提防隱式轉(zhuǎn)換
有一種比較低級(jí)錯(cuò)誤,比如我有個(gè)字段名a,保存內(nèi)容為年齡,但是誤用了varchar字段,那 select a from table where a = 18,走不走索引?不走的,雖然mysql很智能,這個(gè)sql沒(méi)有報(bào)錯(cuò),但是mysql為此針對(duì)列a做了字符串到數(shù)字的轉(zhuǎn)換,我們都知道一旦針對(duì)某個(gè)字段做了函數(shù)轉(zhuǎn)換,那就不走索引了。再引申一下,索引失效以后 update table set b = 10086 where a = 18,由于索引失效,針對(duì)a的查詢(xún)需要全表掃描,針對(duì)a的修改又需要加寫(xiě)鎖。所以本來(lái)的行級(jí)寫(xiě)鎖變?yōu)榱吮砑?jí)寫(xiě)鎖。并發(fā)能力大大降低!
總結(jié)
以上是生活随笔為你收集整理的mysql datetime month不走索引_like百分号加前面一定不走索引吗?一不小心就翻车,关于mysql索引那些容易错的点...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HPWuSchd2.exe是什么进程 作
- 下一篇: mysql_fetch_bit_mysq