1. 程式人生 > >Mysql 之索引優化及索引失效

Mysql 之索引優化及索引失效

1.最佳左字首法則-如果索引了多列,要遵守最左字首法則.指的是查詢從索引的最左前列開始並且不跳過索引中的列.

2.不在索引上左任何操作(計算,函式,(自動or手動)型別轉換),會導致索引失效而轉向全表掃描

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

4.儘量使用覆蓋索引(只訪問索引的查詢(索引列和查詢列一致)),減少select*

5.mysql在使用不等於(!=或者<>)的時候無法使用索引會導致全表掃描

6.is null,is not null也無法使用索引

7.like以萬用字元開頭('%abc')mysql索引失效會變成全表掃描

8.字串不加單引號索引失效

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

在上篇mysql索引demo中student表基礎上建立index_name_age_sex組合索引(name,age,sex)

最佳左字首法則

如圖,在跳過age的時候只使用了部分索引,而且Extra還出現了Using index conidtion意味著雖然查詢的時候使用了索引,但還是要進行回表查詢資料,而最後一條sql,直接跳過name和age則完全沒有使用索引。。。。

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

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

根據key可以得知都有使用索引,但根據key_len對比,發現使用了age>23的範圍查詢,最後面的sex的索引失效了,並且還需要進行回表查詢

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

mysql在使用不等於(!=或者<>)的時候無法使用索引會導致全表掃描

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

通過對比發現,當is null或者 is not null處於第一個索引欄位,則根本不會使用索引進行查詢,當使用在中間欄位或者最好欄位的時候,則查詢使用索引,但還是要回表查資料,因此,最好不要用is null或者is not null,非要用的話,則放於索引欄位順序的最後一位.

like以萬用字元開頭('%abc')mysql索引失效會變成全表掃描

通過上圖得出like 兩邊都有%,和欄位前面有%,索引會失效,%在欄位後面索引有效,

但實際業務中,%一般都會是前後使用,這時怎麼使索引有效?對比下面2張圖

查詢的列只要有組合索引的一個欄位,也就是使用覆蓋索引,索引便有效,但只要有一個查詢欄位未建索引,索引便會失效.

刪除調之前的索引,建立組合索引stuName(stuName,gradename,age),如下圖

  gradeName like'一%年%'的時候使用範圍查詢,所有索引都有使用,也就說當like的條件%前面是常量的時候,索引有效.

字串不加單引號索引失效

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