在MySQL 中 IS NULL 、IS NOT NULL 、!=不能用索引?胡扯! - 掘金中,它说:
对于二级索引来说,索引列的值可能为 NULL 。那对于索引列值为 NULL 的二级索引记录来说,它们被放在 B+树的哪里呢?答案是:放在 B+树的最左边。
但是我并没有找到相关的官方资料说明这个东西,MySQL InnoDB 真的是如文章所说的那样存储 null 的吗?
1
yyyyfan 2020 年 7 月 31 日 via Android
mysql 数据库是视 null 值小于任何的一个非 null 值
|
3
iConnect 2020 年 7 月 31 日 via Android
MySQL 官方早就解决 Null 索引的问题了,具体哪个版本开始需要去看下文档
|
4
JasonLaw OP @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”的官方文档,可惜我没有找到。
|
6
zhangysh1995 2020 年 7 月 31 日
应该需要看源代码了,参考 https://dev.mysql.com/doc/internals/en/files-in-innodb-sources.html 里面 \btr (B-TREE) 一节
|
7
zhangysh1995 2020 年 7 月 31 日
我大概看了一下 optimizer 部分 NULL 的存储,是从内存 load 进来的,也就是说底层存储引擎存了 NULL 这个值。https://dev.mysql.com/doc/dev/mysql-server/latest/classField__null.html
|
8
wangyzj 2020 年 7 月 31 日
这是一个好问题
空值会索引吗? |
9
louettagfh 2020 年 8 月 3 日
NULL 就是一个标志位
|
10
zhangwugui 2020 年 8 月 6 日
是个好问题; 我也有相同的疑惑;
null 在 mysql 行存储中,是有标识位的概念的; 但 null 在索引中如何存储的,我好像也没找到对应的文档。 |
11
Jericho112 2022 年 3 月 10 日
索引的最左侧,可以看下这篇文章: https://cloud.tencent.com/developer/article/1658064
|