没注意过这个问题
唯一索引可以允许多个空值,并且你查询空值时还能用上索引??
下面分析下它咋存的
我查看了下这个索引页的数据
把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
可以看到,非空值的辅助索引都是(主键、索引)
的形式,但是空值的索引只有主键,就是一个辅助索引项如果只有主键,那么它的索引列就是空的。所以只需要对索引进行一个整个的扫描,找到这些只保存了主键的项目,它们就是索引列为空的。
至于为什么用了索引,扫描索引当然比扫描整个表快了,因为辅助索引肯定比整个表占用更少的磁盘页,所以能够扫描索引得到的数据就不要进行全表扫描。