索引失效的若干種情況

2021-09-09 08:21:19 字數 1414 閱讀 4865

0. 建表

上圖首先建了乙個staffs表,然後插入了三條資料,最後建立在乙個組合索引

2.索引優化

我們把組合索引比作成一輛火車,第乙個欄位為火車頭,其他的字段比作一節車廂,火車能執行的前提條件是火車頭不能斷掉,如果中間車廂斷了,那麼後續車廂也不能跑了.總之能夠跑動的車廂所代表的索引都有效.也就是說組合索引只有一部分索引欄位被使用.一部分失效.

2.1 全值匹配我最愛

也就是查詢條件全部用到了索引

2.2 最佳左字首法則

上圖的情況, 查詢條件直接用到了火車頭,索引有效,但也僅僅是用到了乙個欄位.

上圖的情況,查詢條件用到了火車頭和第二節車廂,索引有效,但也僅僅是用到了兩個字段

上圖的情況,查詢條件用到了 火車頭和第三節車廂,由於第二節車廂斷了,所以索引只用到了乙個字段(火車頭)

上圖的情況,火車頭沒了,索引全部失效.

2.3 不能在索引列上幹任何操作(計算,函式,型別轉換)

由於對name進行了字串擷取,雖然可以查到資料,但是索引失效

2.4 儲存引擎不能使用索引中範圍條件右邊的列

結合上面的圖分析值,索引用到乙個,二個,三個的時候,key_len分別對應74 ,78, 140.

此處用到了name和age欄位,由於age是個範圍查詢,索引pos欄位上的索引失效

2.5 盡量使用覆蓋索引(只訪問索引的查詢),減少select *

這張圖與2.4節的圖很相似,2.4中是select *,此處是select name,age,pos,此處用到了覆蓋索引,索引type是ref,效能好於range,儘管只用到了乙個欄位.另外extra中顯示用到using index 和using where ,表明只需要從索引樹中尋找資料,不需要到表中尋找,而2.4中僅僅只有using where,表明需要到表中尋找.因此2.4中的查詢效能低於次此處.

2.6 mysql在使用不等於(!=或者<>)的時候索引失效

type為all,表明是全表掃瞄,索引失效

2.7 is null, is not null 也無法使用索引

2.8 like以萬用字元開頭("%abc..."),索引會失效

可以看到表裡有乙個name為axyd的資料

很可惜  like  '%xy%'會導致索引失效,如何解決呢,用覆蓋索引,也就是select欄位全部都被建立了索引.

這裡select的字段全部都建立在索引上,所以解決了萬用字元在前頭導致索引失效的問題.當然你如果僅僅select 索引欄位中的一部分字段,也不會導致索引失效.總之只要select欄位是索引欄位的子集就沒問題.

2.9 字串不加單引號,索引會失效

這種情況mysql會將數字轉換成string幫你查詢,導致了索引失效,下面的圖加了單引號,索引有效!

2.10 少用or,用它來連線時索引會失效

3. 總結

--------------------- 

索引失效的7種情況

1.有or必全有索引 2.復合索引未用左列字段 3.like以 開頭 4.需要型別轉換 5.where中索引列有運算 6.where中索引列使用了函式 7.如果mysql覺得全表掃瞄更快時 資料少 1.唯一性差 2.頻繁更新的字段不用 更新索引消耗 3.where中不用的字段 4.索引使用 時,效果...

索引失效的7種情況

1.有or必全有索引 2.復合索引未用左列字段 3.like以 開頭 4.需要型別轉換 5.where中索引列有運算 6.where中索引列使用了函式 7.如果mysql覺得全表掃瞄更快時 資料少 1.唯一性差 2.頻繁更新的字段不用 更新索引消耗 3.where中不用的字段 4.索引使用 時,效果...

mysql 索引失效的7種情況

1.有or必全有索引 2.復合索引未用左列字段 3.like以 開頭 4.需要型別轉換 5.where中索引列有運算 6.where中索引列使用了函式 7.如果mysql覺得全表掃瞄更快時 資料少 1.唯一性差 2.頻繁更新的字段不用 更新索引消耗 3.where中不用的字段 4.索引使用 時,效果...