網上很多部落格中都寫到: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 將無法使用索引。...