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

-江沐风- 2020-08-06 12:57:11
最近看了篇文章:MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!

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

我想咨询下这个说法的正确性及对应的官方说明或者官方链接?因为我没有找到对应的官方文档。


...全文
980 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

有一个null值列表,用一个bit位,来表示一个字段,1为null,0为not null

-江沐风- 2020-08-14
  • 打赏
  • 举报
回复
引用 4 楼 大雨将至 的回复:
想弄明白如何存储估计得看代码了,官方文档不会深入到这么细节的内容 但是从B+树原理看,最方便的肯定是存在最左边或者最右边,用代表NULL的特殊标记去填充非叶子节点
我仔细看了下mysql的数据行存储及磁盘,应该就像你说的,是以存储行最前面的null标记位进行存储; 因为InnoDB中,数据即索引,用null标记位存储null,然后针对非聚簇索引,行中存主键;然后排序的话,将null标记位的排在最前面。
大雨将至 2020-08-10
  • 打赏
  • 举报
回复
想弄明白如何存储估计得看代码了,官方文档不会深入到这么细节的内容

但是从B+树原理看,最方便的肯定是存在最左边或者最右边,用代表NULL的特殊标记去填充非叶子节点
-江沐风- 2020-08-09
  • 打赏
  • 举报
回复
引用 1 楼 大雨将至 的回复:
NULL不能用索引不是绝对的,但是仍然不建议允许NULL,设置默认值最好 参考 https://dev.mysql.com/doc/refman/8.0/en/is-null-optimization.html != 语意下,索引只能过滤掉很少的数据,然后还要回表去取,不划算。Mysql大部分情况下会放弃索引,所以建了也白建 这种文章咬文嚼字没啥意义
其实我主要还是想知道,索引存null的时候是怎么存的。
宇峰科技 2020-08-08
  • 打赏
  • 举报
回复
关注学习一下
大雨将至 2020-08-07
  • 打赏
  • 举报
回复
NULL不能用索引不是绝对的,但是仍然不建议允许NULL,设置默认值最好

参考 https://dev.mysql.com/doc/refman/8.0/en/is-null-optimization.html

!= 语意下,索引只能过滤掉很少的数据,然后还要回表去取,不划算。Mysql大部分情况下会放弃索引,所以建了也白建

这种文章咬文嚼字没啥意义

56,912

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧