mysql null会导致索引失效吗

网上很多博客中都写到: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条数据:

mysql null会导致索引失效吗_第1张图片

 

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)