1. 程式人生 > >Mysql索引失效的情況,及更優使用情況

Mysql索引失效的情況,及更優使用情況

https://blog.csdn.net/wuseyukui/article/details/72312574

 

案例所用的表結構、索引、與資料如下:

這裡寫圖片描述
這裡寫圖片描述

索引失效與優化

這裡寫圖片描述

1、全值匹配我最愛

這裡寫圖片描述

2、最佳左字首法則(帶頭索引不能死,中間索引不能斷)

如果索引了多個列,要遵守最佳左字首法則。指的是查詢從索引的最左前列開始 並且 不跳過索引中的列。 
正確的示例參考上圖。

錯誤的示例: 
帶頭索引死: 
這裡寫圖片描述
中間索引斷(帶頭索引生效,其他索引失效): 
這裡寫圖片描述

3、不要在索引上做任何操作(計算、函式、自動/手動型別轉換),不然會導致索引失效而轉向全表掃描

這裡寫圖片描述

4、mysql儲存引擎不能繼續使用索引中範圍條件(bettween、<、>、in等)右邊的列

這裡寫圖片描述

5、儘量使用覆蓋索引(只查詢索引的列(索引列和查詢列一致)),減少select *

這裡寫圖片描述

6、索引欄位上使用(!= 或者 < >)判斷時,會導致索引失效而轉向全表掃描

這裡寫圖片描述

7、索引欄位上使用 is null / is not null 判斷時,會導致索引失效而轉向全表掃描

這裡寫圖片描述

8、索引欄位使用like以萬用字元開頭(‘%字串’)時,會導致索引失效而轉向全表掃描

這裡寫圖片描述
由結果可知,like以萬用字元結束相當於範圍查詢,索引不會失效。與範圍條件(bettween、<、>、in等)不同的是:不會導致右邊的索引失效。

問題:解決like ‘%字串%’時,索引失效問題的方法? 
使用覆蓋索引可以解決。 
這裡寫圖片描述
這裡寫圖片描述

9、索引欄位是字串,但查詢時不加單引號,會導致索引失效而轉向全表掃描

這裡寫圖片描述

10、索引欄位使用 or 時,會導致索引失效而轉向全表掃描

這裡寫圖片描述

小總結

這裡寫圖片描述

這裡寫圖片描述