谣言止于“实验”——MYSQL NULL 与索引

编程入门 行业动态 更新时间:2024-10-26 22:22:02

<a href=https://www.elefans.com/category/jswz/34/1740670.html style=谣言止于“实验”——MYSQL NULL 与索引"/>

谣言止于“实验”——MYSQL NULL 与索引

如果经常混坛子,你会听说一种言论,就是NULL 走不了索引,尤其在MYSQL的论坛里面,基本上不出意外,你每天都能看到这样的言论。事实上是怎样,或许没人关注,而到底 NULL 走不走索引,其实是有必要进行一番验证的。本次使用了  MYSQL 8.015 来做这个验证。

首先的先标准化一些事情

1 数据表到底是哪种格式 (DYNAMIC)

2 此种格式的特点,以及NULL 在这样存储格式是怎么进行处理的

Dynamic 这种行的存储格式有一些特点

1 所有的字符串的值大于 4 的都是动态的

2 每一行前都有一个位图,位图指示哪些列包含空字符串或零。如果字符串列在删除尾随空间后长度为零,或者数字列的值为零,则在位图中标记它,而不是保存到磁盘。非空字符串保存为长度字节加上字符串内容。

3 空列需要行中额外的空间来记录它们的值是否为空。

从上面的话,总结出来一句话,NULL 需要额外的空间来保存他,对比在你的字段里面'' 或者  0 来表明默认值,NULL 比他们更浪费空间。

在MYSQL5.7中NULL 是可以用\N  来代表NULL ,但在MYSQL 8 中被废弃了,NULL 就是NULL 来代表。

这里有一个问题,提出NULL 不好,而要表设计中尽量不为空的依据是哪里来的。我们可以根据官方文档中的一段话来说明。

其中有几句,不使用NULL,可以

1  更好的使用INDEX 

2  节省空间

3  加速SQL 的运行

OK,那我们就来做一下实验,看看怎么来证明使用NULL 到底能不能走索引

从上图来看,查询空值是可以走索引的。那我们换只用写法我们差 is not null

看上去的确是is not null是不能走索引,但实际上是这样的吗,是数量引起的全表扫描,还是is not null引起的问题?

下面的实验证明 is not null也是可以走索引的,而is not null 无法走索引的情况和平时其他走不了索引的情况是一样的,主要还是看cost 成本计算。

如果是OR 条件中 使用 is null or  is null ,从下图看是可以走索引的

按照索引的原理,二级索引的值是可以为NULL, 而索引的列值为NULL 的二级索引记录来说,B+树种的NULL 的值存在哪里,一般来说是B+树的最左边。

我们继续进行测试,如果将部分条件和 is not null联合进行查询,从下图看也是会走相关索引的。

所以上面的实验证明了, is null , is not null  都是可以走相关的索引的,如果不走索引要不就是相关走INDEX 的成本比全表扫描还高,要不就是索引可能失效,或统计分析出了问题。

更多推荐

谣言止于“实验”——MYSQL NULL 与索引

本文发布于:2024-02-11 08:33:06,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1680045.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:谣言   止于   索引   MYSQL   NULL

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!