轉(zhuǎn)自:https://blog.csdn.net/wuseyukui/article/details/72312574
案例所用的表結(jié)構(gòu)、索引椭坚、與數(shù)據(jù)如下:
索引失效與優(yōu)化
1.全值匹配
2.最佳左前綴法則
3.不在索引列上做任何操作(計(jì)算良价、函數(shù)寝殴、(自動(dòng)or手動(dòng))類型轉(zhuǎn)換),會(huì)導(dǎo)致索引失效而轉(zhuǎn)向全表掃描
4.存儲(chǔ)引擎不能使用索引中范圍條件右邊的列
5.盡量使用覆蓋索引(只訪問(wèn)索引的查詢(索引列和查詢列一直))明垢,減少select *
6.mysql在使用不等于(!=或者<>)的時(shí)候無(wú)法使用索引會(huì)導(dǎo)致全表掃描
7.is null蚣常, is not null也無(wú)法使用索引
8.like以通配符開頭(‘%abc...’)mysql索引失效會(huì)變成全表掃描的操作
9.字符串不加單引號(hào)索引失效
10.少用or,用它來(lái)連接時(shí)索引會(huì)失效
1痊银、全值匹配
2抵蚊、最佳左前綴法則(帶頭索引不能死,中間索引不能斷)
錯(cuò)誤的示例:
帶頭索引死:
中間索引斷(帶頭索引生效溯革,其他索引失效):
3贞绳、不要在索引上做任何操作(計(jì)算、函數(shù)致稀、自動(dòng)/手動(dòng)類型轉(zhuǎn)換)冈闭,不然會(huì)導(dǎo)致索引失效而轉(zhuǎn)向全表掃描
4、mysql存儲(chǔ)引擎不能繼續(xù)使用索引中范圍條件(bettween抖单、<萎攒、>、in等)右邊的列
5矛绘、盡量使用覆蓋索引(只查詢索引的列(索引列和查詢列一致))耍休,減少select
6、索引字段上使用(货矮!= 或者 < >)判斷時(shí)羊精,會(huì)導(dǎo)致索引失效而轉(zhuǎn)向全表掃描
7、索引字段上使用 is null / is not null 判斷時(shí)次屠,會(huì)導(dǎo)致索引失效而轉(zhuǎn)向全表掃描
8园匹、索引字段使用like以通配符開頭(‘%字符串’)時(shí)雳刺,會(huì)導(dǎo)致索引失效而轉(zhuǎn)向全表掃描
由結(jié)果可知,like以通配符結(jié)束相當(dāng)于范圍查找裸违,索引不會(huì)失效掖桦。與范圍條件(bettween、<供汛、>枪汪、in等)不同的是:不會(huì)導(dǎo)致右邊的索引失效。
**問(wèn)題:解決like ‘%字符串%’時(shí)怔昨,索引失效問(wèn)題的方法雀久? **
使用覆蓋索引可以解決。
小總結(jié)