MySQL索引失效的情況

Mysql索引查詢失效的情況

首先,復(fù)習(xí)一下索引的創(chuàng)建:

普通的索引的創(chuàng)建:

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

復(fù)合索引的創(chuàng)建:

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

刪除索引:DROP INDEX 索引名;

以下通過explain顯示出mysql執(zhí)行的字段內(nèi)容:

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

  • select_type: SELECT 查詢的類型.

  • table: 查詢的是哪個表

  • partitions: 匹配的分區(qū)

  • type: join 類型

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

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

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

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

  • filtered: 表示此查詢條件所過濾的數(shù)據(jù)的百分比

  • extra: 額外的信息

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

1、like 以%開頭,索引無效;當(dāng)like前綴沒有%,后綴有%時,索引有效。

image

2、or語句前后沒有同時使用索引。當(dāng)or左右查詢字段只有一個是索引,該索引失效,只有當(dāng)or左右查詢字段均為索引時,才會生效

image
image

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

image

4、數(shù)據(jù)類型出現(xiàn)隱式轉(zhuǎn)化。如varchar不加單引號的話可能會自動轉(zhuǎn)換為int型,使索引無效,產(chǎn)生全表掃描。

image

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

image

解釋以上錯誤:

此處我將重新創(chuàng)建一個emp表

image

創(chuàng)建新的索引

image

查看索引

image

執(zhí)行SQL語句

image
image

由此可發(fā)現(xiàn)有使用到索引

總結(jié):在索引列上使用 IS NULL 或 IS NOT NULL操作,索引不一定失效?。?!

使用聯(lián)合查詢請參考:http://m.itdecent.cn/p/3cae3e364946

錯誤詳解請參考:https://mp.weixin.qq.com/s/CEJFsDBizdl0SvugGX7UmQ

6、在索引字段上使用not,<>,!=。不等于操作符是永遠(yuǎn)不會用到索引的,因此對它的處理只會產(chǎn)生全表掃描。 優(yōu)化方法: key<>0 改為 key>0 or key<0。

image
image

7、對索引字段進(jìn)行計算操作、字段上使用函數(shù)。(索引為 emp(ename,empno,sal))

image
image

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

索引失效分析工具:

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容