Mysql 之索引優化及索引失效

2021-08-21 11:23:57 字數 2447 閱讀 9862

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_***組合索引(name,age,***)

最佳左字首法則

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

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

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

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

盡量使用覆蓋索引(只訪問索引的查詢(索引列和查詢列一致)),減少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,用它來連線時會索引失效

Mysql之索引失效

建立乙個index test庫 create database index test 在index test庫中建立一張user表 use index test create table user id bigint,name varchar 50 age int 4 gender varchar ...

MySQL 查詢索引失效及如何進行索引優化

我們都知道建立索引的目的是快速從整體集合中選擇性地讀取滿足條件的一部分集合。mysql中一張表是可以支援多個索引的。但是,你寫sql語句的時候,並沒有主動指定使用哪個索引。不知道你有沒有碰到過這種情況,一條建立了索引的sql語句在查詢過程中卻沒有使用索引,或是一條本來可以執行的很快的語句,卻由於my...

深入MySQL優化 索引失效

最佳左字首法則 所謂的最佳左字首法則就是查詢時使用到的字段順序需要滿足建立索引時的字段順序。看下面的栗子 在staffs表上,建立 name,age.pos 的索引 可以看到在index表上,name,age,pos的seq in indexx是按照建立索引時的順序從小到大的,即name age p...