Mysql索引查詢失效的情況

首先,複習一下索引的創建:

普通的索引的創建:

CREATE INDEX  (自定義)索引名  ON  數據表(字段);

複合索引的創建:

CREATE INDEX  (自定義)索引名  ON  數據表(字段,字段,。。。);

刪除索引:DROP INDEX 索引名;

以下通過explain顯示出mysql執行的字段內容:

  • id: SELECT 查詢的標識符. 每個 SELECT 都會自動分配一個唯一的標識符.

  • select_type: SELECT 查詢的類型.

  • table: 查詢的是哪個表

  • partitions: 匹配的分區

  • type: join 類型

  • possible_keys: 此次查詢中可能選用的索引

  • key: 此次查詢中確切使用到的索引.

  • ref: 哪個字段或常數與 key 一起被使用

  • rows: 顯示此查詢一共掃描了多少行. 這個是一個估計值.

  • filtered: 表示此查詢條件所過濾的數據的百分比

  • extra: 額外的信息

 

索引查詢失效的幾個情況:

1、like 以%開頭,索引無效;當like前綴沒有%,後綴有%時,索引有效。

2、or語句前後沒有同時使用索引。當or左右查詢字段只有一個是索引,該索引失效,只有當or左右查詢字段均爲索引時,纔會生效

3、組合索引,不是使用第一列索引,索引失效。

 

4、數據類型出現隱式轉化。如varchar不加單引號的話可能會自動轉換爲int型,使索引無效,產生全表掃描。

5、在索引列上使用 IS NULL 或 IS NOT NULL操作。索引是不索引空值的,所以這樣的操作不能使用索引,可以用其他的辦法處理,例如:數字類型,判斷大於0,字符串類型設置一個默認值,判斷是否等於默認值即可。

6、在索引字段上使用not,<>,!=。不等於操作符是永遠不會用到索引的,因此對它的處理只會產生全表掃描。 優化方法: key<>0 改爲 key>0 or key<0。

7、對索引字段進行計算操作、字段上使用函數。(索引爲 emp(ename,empno,sal))

8、當全表掃描速度比索引速度快時,mysql會使用全表掃描,此時索引失效。

 

索引失效分析工具:

可以使用explain命令加在要分析的sql語句前面,在執行結果中查看key這一列的值,如果爲NULL,說明沒有使用索引。

explain命令的詳細用法,可以查看這篇文章:https://segmentfault.com/a/1190000008131735

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章