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还是选择使用了索引?很简单,扫描索引当然比扫描整个表快了,因为辅助索引是非聚集索引,它小的很,肯定比整个表占用更少的磁盘页,所以能够扫描索引得到的数据就不要进行全表扫描。
作者:Yudoge
出处:https://www.cnblogs.com/lilpig/p/15670641.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
欢迎按协议规定转载,方便的话,发个站内信给我嗷~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)