数据库原理-可为NULL字段在何时索引失效?(部分理解,若有不到位的请各位前辈指正)

可为NULL字段在何时索引失效?



前言

在一篇博客上看到一哥们说 : “官方文档显示,字段为null时,如果该字段有索引,查询该字段的时候是走索引的,两个字段组成的复合索引,都为null时,才不走索引”。不是很懂,因此我自己动手实践了下,来查看是否正确,并在博客上记录下。但优化器真正怎么做的可能自己也理解的不到位,若有前辈指正,会在博客上更新哒。

一、数据表创建

创建一个有两个字段可为NULL的表。

CREATE TABLE test_null (
 `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT '' ,
  `name_null` varchar(32) DEFAULT NULL,
	`age_null` int(11) DEFAULT NULL,
  `name_empty` varchar(32)  DEFAULT '',
  PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

表数据:
在这里插入图片描述

二、单列索引和联合索引

创建idx_numa_null的单列索引和idx_name_age_null的联合索引。

CREATE INDEX idx_name_null ON test_null(name_null);

CREATE INDEX idx_name_age_null ON test_null(name_null,age_null);

1.全值匹配使用索引

对于单个NULL值在查询过程中会使用到索引。

EXPLAIN SELECT * FROM test_null WHERE name_null = 'c';

使用了索引
在这里插入图片描述

2.对于匹配两个可为NULL的列值

2.1 单列索引和联合索引都存在

对于双值在查询过程中会使用到联合索引。

EXPLAIN SELECT * FROM test_null WHERE name_null = 'c' AND age_null = 5;

使用了联合索引
在这里插入图片描述

2.2.当联合索引被删除后

当联合索引被删除后,使用单列索引

DROP INDEX idx_name_age_null ON test_null;

EXPLAIN SELECT * FROM test_null WHERE name_null = 'c' AND age_null = 5;

使用了联合索引在这里插入图片描述

2.3 对于OR

当然对于or来说,OR前后存在非索引的列,索引失效。

总结

从实践上来看,就算是两个都可为NULL的列组成的联合索引也是会被使用的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值