我覺得索引失效只有兩種情況
● 一種是,無法使用索引,用不上索引
● 還有一種是,沒必要走索引,直接全表掃描(Type = All),把主鍵索引的葉子節(jié)點(diǎn)全部走一遍的效率(全表掃描),比走二級索引,然后再回表的效率高。
● 比如說,范圍查詢占比太大,超過了全表的30%(這里并不準(zhǔn)確),官網(wǎng)是這么說的: a scan was used based on whether the best index spanned more than 30% of the table, but a fixed percentage no longer determines the choice between using an index or a scan. The optimizer now is more complex and bases its estimate on additional factors such as table size, number of rows, and I/O block size.優(yōu)化器就會(huì)放棄使用索引,選擇進(jìn)行全表掃描。
● 任何查詢走不走所謂的索引都是看成本,畢竟我們的目的就是盡可能快的查詢數(shù)據(jù)。怎么快,怎么來。
具體有哪些索引失效的場景?
● like “%xx” "%xx%”,這種左模糊查詢或者左右模糊查詢,就可能導(dǎo)致索引失效,當(dāng)然也可能走索引,比如正好可以使用索引覆蓋。
● a = x or b = y,or 前后只要有一個(gè)字段不是索引字段,就會(huì)導(dǎo)致索引失效,如果兩個(gè)字段都是索引字段,那么會(huì)走索引,這種情況就是索引合并。
● 對索引列進(jìn)行計(jì)算,或者使用函數(shù),那么也會(huì)導(dǎo)致索引失效。
● 這里提一下,MySQL在遇到字符串和數(shù)字的比較,會(huì)自動(dòng)將字符串轉(zhuǎn)換成數(shù)字,然后再進(jìn)行比較
● 對索引列進(jìn)行隱式類型轉(zhuǎn)換,比如索引字段是varchar類型的,你查詢的時(shí)候輸入的字段參數(shù)是整數(shù)類型的話,這里就會(huì)對字段進(jìn)行類型轉(zhuǎn)換,導(dǎo)致索引失效。
● 使用聯(lián)合索引的時(shí)候,不符合最左前綴原則,就可能導(dǎo)致索引失效,當(dāng)然也可能走索引,比如正好可以使用索引覆蓋。
● null:is null、is not null ;索引本身不對null值的數(shù)據(jù)做處理。理論上不要讓字段為null,處理方法:建表的時(shí)候,字段強(qiáng)制不為null、字段設(shè)置默認(rèn)值。文章來源地址http://www.zghlxwxcb.cn/news/detail-454318.html
文章來源:http://www.zghlxwxcb.cn/news/detail-454318.html
到了這里,關(guān)于索引什么場景下會(huì)失效?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!