mysql null会导致索引失效吗
程序员文章站
2024-03-16 21:55:58
...
网上很多博客中都写到: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条数据:
1.IS NULL的实验分析
依次减少该表b字段值为null的数量,分别执行以下sql看其执行计划:
EXPLAIN
SELECT * FROM t_union_index WHERE b IS NULL;
实验结果:
当b字段为null的数量大于等于6的时候,不会走索引
当b字段为null的数量为小于等于5个的时候,会走索引index_b
2.IS NOT NULL的实验分析
依次增加该表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%的时候,会走索引。
上一篇: MySQL索引失效
下一篇: Mysql——索引失效