MySQL InnoDB 的索引将 null 存储在哪里?

2020-07-31 09:09:13 +08:00
 JasonLaw

MySQL 中 IS NULL 、IS NOT NULL 、!=不能用索引?胡扯! - 掘金中,它说:

对于二级索引来说,索引列的值可能为 NULL 。那对于索引列值为 NULL 的二级索引记录来说,它们被放在 B+树的哪里呢?答案是:放在 B+树的最左边。

但是我并没有找到相关的官方资料说明这个东西,MySQL InnoDB 真的是如文章所说的那样存储 null 的吗?

3693 次点击
所在节点    MySQL
11 条回复
yyyyfan
2020-07-31 09:18:40 +08:00
mysql 数据库是视 null 值小于任何的一个非 null 值
JasonLaw
2020-07-31 09:28:35 +08:00
@yyyyfan #1 有没有官方文档说明这个东西呢?我并没有找到相关的内容。
iConnect
2020-07-31 09:30:50 +08:00
MySQL 官方早就解决 Null 索引的问题了,具体哪个版本开始需要去看下文档
JasonLaw
2020-07-31 09:47:20 +08:00
@iConnect #3 虽然 https://dev.mysql.com/doc/refman/8.0/en/is-null-optimization.html 说了“MySQL can perform the same optimization on col_name IS NULL that it can use for col_name = constant_value. For example, MySQL can use indexes and ranges to search for NULL with IS NULL.”,但是我更想知道“索引是怎么存储 null”的官方文档,可惜我没有找到。
iConnect
2020-07-31 09:56:38 +08:00
@JasonLaw 只有两种方案,原始的就是继承底层空指针,或者存的值就是 0 。(没有去验证过具体版本的实现)
zhangysh1995
2020-07-31 13:07:42 +08:00
应该需要看源代码了,参考 https://dev.mysql.com/doc/internals/en/files-in-innodb-sources.html 里面 \btr (B-TREE) 一节
zhangysh1995
2020-07-31 13:08:56 +08:00
我大概看了一下 optimizer 部分 NULL 的存储,是从内存 load 进来的,也就是说底层存储引擎存了 NULL 这个值。https://dev.mysql.com/doc/dev/mysql-server/latest/classField__null.html
wangyzj
2020-07-31 18:15:02 +08:00
这是一个好问题
空值会索引吗?
louettagfh
2020-08-03 00:19:58 +08:00
NULL 就是一个标志位
zhangwugui
2020-08-06 11:57:34 +08:00
是个好问题; 我也有相同的疑惑;
null 在 mysql 行存储中,是有标识位的概念的;
但 null 在索引中如何存储的,我好像也没找到对应的文档。
Jericho112
2022-03-10 10:05:02 +08:00
索引的最左侧,可以看下这篇文章: https://cloud.tencent.com/developer/article/1658064

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/694500

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX