转载自 InnoDB 的辅助索引叶子节点为什么不直接保存的记录地址而要存主键键值
RT,最近看书关于innodb的
InnoDB是索引组织表,所以完整的数据记录都存在聚集索引的叶子节点上
辅助索引的叶子节点保存的是对应的主键键值,而另外一种存储引擎myisam叶子节点保存的是记录的地址
我的问题是InnoDB 的辅助索引叶子节点为什么不直接保存的记录地址而要存主键键值?(导致在使用辅助索引的查询中要两次访问索引)
ps:想到的一个可能原因是 update 非索引列时,不需要更新辅助索引页,不知道还有没有其它原因?
(1)
本身innodb是以主键为主排序的表。。所以对于innodb来讲,其在磁盘的排序已经由主键的顺序定了,不能再按其它健排序。
其实辅助索引只要主键也有它的优点:一个磁盘块能存储更多的键值,使其在进行索引查找是,只需要读取相对少量的磁盘块就能扫描完全表,加之读到主键,再查询记录是比较快的。
根本原因是INNODB是主键的索引组织表,其物理存储已经由主键决定,不能再改变在磁盘中的存储顺序。
(2)
“一个磁盘块能存储更多的键值”
这个未必吧,还得取决于主键和地址的大小,地址一般由 文件号+块号+块内偏移组成,大概10个字节
不过也可以作为一个考虑因素,谢谢你的回复
(3)
个人也觉得是跟DML有关,当对一个innodb表进行大量DML后,B+树会分裂,同一行记录的页地址会发生变化。
由于辅助索引记录的是主键值,因此完全不用理会这个变化,如果辅助索引记录的是实际页地址,那DML一旦引起B+树分裂,还得与辅助索引进行同步。