mysql null會導致索引失效嗎

2021-10-02 06:47:08 字數 1308 閱讀 2631

網上很多部落格中都寫到:is null ,is not null

無法使用索引

首先說下,該結論經過驗證是錯誤的。

現在通過例項來驗證下:

我的myslq版本是:5.7.28

建表語句

create table `t_union_index` (

`id` bigint(20) not null auto_increment,

`a` bigint(255) default null,

`b` bigint(255) default null,

`c` bigint(255) default null,

primary key (`id`),

key `index_b` (`b`) using btree

) engine=innodb auto_increment=11 default charset=utf8;

其中b建了單獨的索引

共插入10條資料:

依次減少該錶b字段值為null的數量,分別執行以下sql看其執行計畫:

explain

select * from t_union_index where b is null;

實驗結果:

當b欄位為null的數量大於等於6的時候,不會走索引

當b欄位為null的數量為小於等於5個的時候,會走索引index_b

依次增加該錶b字段值不為null的數量,分別執行以下sql看其執行計畫:

explain

select*from t_union_index where b is not null;

實驗結果:

當b欄位不為null的數量小於等於3時候,會走索引index_b

當b欄位不為null的數量大於等於4的時候,不會走索引

預設為null的列,存在null值會導致mysql優化器處理起來比較複雜,但是到底走不走索引,或者走那個索引,是要靠mysql優化器預先預估走那個索引成本比較低來決定的

我實驗中的大致結果是:

查詢條件中is null,當命中結果數量小於40%的時候,會走索引。

查詢條件中的is not null,命中結果數小於30%的時候,會走索引。

會導致索引失效語句

1 使用like關鍵字模糊查詢時,放在前面索引不起作用,只有 不在第乙個位置,索引才會生效 like 文 索引不起作用 2 使用聯合索引時,只有查詢條件中使用了這些欄位中的第乙個字段,索引才會生效 3 使用or關鍵字的查詢,查詢語句的查詢條件中只有or關鍵字,且or前後的兩個條件中的列都是索引時,索...

哪些操作會導致索引失效

1 隱式轉換導致索引失效.這一點應當引起重視.也是開發中經常會犯的錯誤.由於表的字段tu mdn定義為varchar2 20 但在查詢時把該字段作為number型別以where條件傳給oracle,這樣會導致索引失效.錯誤的例子 select from test where tu mdn 13333...

有些 where 條件會導致索引無效

在查詢中,where 條件也是乙個比較重要的因素,盡量少並且是合理的 where 條件是徆重要的,盡量在多個條件的時候,把會提取盡量少資料量的條件放在前 面,減少後乙個 where 條件的查詢時間。有些 where 條件會導致索引無效 1.where 子句的查詢條件裡有!mysql 將無法使用索引。...