欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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条数据:

mysql null会导致索引失效吗

 

1.IS NULL的实验分析

依次减少该表b字段值为null的数量,分别执行以下sql看其执行计划:

EXPLAIN

SELECT * FROM t_union_index WHERE b IS NULL;

实验结果:

当b字段为null的数量大于等于6的时候,不会走索引

mysql null会导致索引失效吗

当b字段为null的数量为小于等于5个的时候,会走索引index_b

mysql null会导致索引失效吗

 

2.IS NOT NULL的实验分析

依次增加该表b字段值不为null的数量,分别执行以下sql看其执行计划:

EXPLAIN

SELECT*FROM t_union_index WHERE b IS NOT NULL;

实验结果:

当b字段不为null的数量小于等于3时候,会走索引index_b

mysql null会导致索引失效吗

当b字段不为null的数量大于等于4的时候,不会走索引

mysql null会导致索引失效吗

 

结论:

默认为Null的列,存在Null值会导致mysql优化器处理起来比较复杂,但是到底走不走索引,或者走那个索引,是要靠mysql优化器预先预估走那个索引成本比较低来决定的

我实验中的大致结果是:

查询条件中IS NULL,当命中结果数量小于40%的时候,会走索引。

查询条件中的IS NOT NULL,命中结果数小于30%的时候,会走索引。

相关标签: mysql