InnoDB 的辅助索引叶子节点为什么不直接保存的记录地址而要存主键键值

转载自  InnoDB 的辅助索引叶子节点为什么不直接保存的记录地址而要存主键键值

RT,最近看书关于innodb的
InnoDB是索引组织表,所以完整的数据记录都存在聚集索引的叶子节点上
辅助索引的叶子节点保存的是对应的主键键值,而另外一种存储引擎myisam叶子节点保存的是记录的地址

我的问题是InnoDB 的辅助索引叶子节点为什么不直接保存的记录地址而要存主键键值?(导致在使用辅助索引的查询中要两次访问索引)

ps:想到的一个可能原因是 update 非索引列时,不需要更新辅助索引页,不知道还有没有其它原因?

(1)
本身innodb是以主键为主排序的表。。所以对于innodb来讲,其在磁盘的排序已经由主键的顺序定了,不能再按其它健排序。

其实辅助索引只要主键也有它的优点:一个磁盘块能存储更多的键值,使其在进行索引查找是,只需要读取相对少量的磁盘块就能扫描完全表,加之读到主键,再查询记录是比较快的。

根本原因是INNODB是主键的索引组织表,其物理存储已经由主键决定,不能再改变在磁盘中的存储顺序。

(2)
“一个磁盘块能存储更多的键值”
这个未必吧,还得取决于主键和地址的大小,地址一般由 文件号+块号+块内偏移组成,大概10个字节
不过也可以作为一个考虑因素,谢谢你的回复

(3)

个人也觉得是跟DML有关,当对一个innodb表进行大量DML后,B+树会分裂,同一行记录的页地址会发生变化。
由于辅助索引记录的是主键值,因此完全不用理会这个变化,如果辅助索引记录的是实际页地址,那DML一旦引起B+树分裂,还得与辅助索引进行同步。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值