Loading

MySQL InnoDB 唯一索引多个空值

注意,本篇内容针对MySQL,并且使用InnoDB存储引擎,其他存储引擎对于唯一索引空值的行为不在讨论范围内。

没注意过这个问题

唯一索引可以允许多个空值,并且你查询空值时还能用上索引??

下面分析下它咋存的

我查看了下这个索引页的数据

把infimum和supremum之间的数据格式化一下,就是索引页的数据

80 00 00 01         主键  1
80 00 00 01         辅助索引列 1
00 00 00 18 00 22   下一列offset

80 00 00 02         主键  2
80 00 00 02         辅助索引列 2
01 00 00 20 00 0a   下一列offset

80 00 00 03         主键3 辅助索引列为NULL 没保存
01 00 00 28 ff da   下一列offset

下面的一样

80 00 00 04
00 00 00 30 00 0e

80 00 00 05
80 00 00 05
00 00 00 38 ff b4

80 00 00 06
80 00 00 06

可以看到,非空值的辅助索引都是(主键、索引)的形式,但是空值的索引只有主键,就是一个辅助索引项如果只有主键,那么它的索引列就是空的。所以只需要对索引进行一个整个的扫描,找到这些只保存了主键的项目,它们就是索引列为空的。

看起来,用不用索引并没有多大差别,因为为空的辅助索引列根本没被保存,所以也无法使用B+树的有序特性来进行索引。

那为什么InnoDB还是选择使用了索引?很简单,扫描索引当然比扫描整个表快了,因为辅助索引是非聚集索引,它小的很,肯定比整个表占用更少的磁盘页,所以能够扫描索引得到的数据就不要进行全表扫描。

posted @ 2021-12-10 10:47  yudoge  阅读(286)  评论(0编辑  收藏  举报