在MySQL 中 IS NULL 、IS NOT NULL 、!=不能用索引?胡扯! - 掘金中,它说:
对于二级索引来说,索引列的值可能为 NULL 。那对于索引列值为 NULL 的二级索引记录来说,它们被放在 B+树的哪里呢?答案是:放在 B+树的最左边。
但是我并没有找到相关的官方资料说明这个东西,MySQL InnoDB 真的是如文章所说的那样存储 null 的吗?
1
yyyyfan 2020-07-31 09:18:40 +08:00 via Android
mysql 数据库是视 null 值小于任何的一个非 null 值
|
3
iConnect 2020-07-31 09:30:50 +08:00 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”的官方文档,可惜我没有找到。
|
5
iConnect 2020-07-31 09:56:38 +08:00 via Android
@JasonLaw 只有两种方案,原始的就是继承底层空指针,或者存的值就是 0 。(没有去验证过具体版本的实现)
|
6
zhangysh1995 2020-07-31 13:07:42 +08:00
应该需要看源代码了,参考 https://dev.mysql.com/doc/internals/en/files-in-innodb-sources.html 里面 \btr (B-TREE) 一节
|
7
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
|
8
wangyzj 2020-07-31 18:15:02 +08:00
这是一个好问题
空值会索引吗? |
9
louettagfh 2020-08-03 00:19:58 +08:00
NULL 就是一个标志位
|
10
zhangwugui 2020-08-06 11:57:34 +08:00
是个好问题; 我也有相同的疑惑;
null 在 mysql 行存储中,是有标识位的概念的; 但 null 在索引中如何存储的,我好像也没找到对应的文档。 |
11
Jericho112 2022-03-10 10:05:02 +08:00
索引的最左侧,可以看下这篇文章: https://cloud.tencent.com/developer/article/1658064
|