Chinaunix

标题: 请教一个InnoDB的辅助索引问题 [打印本页]

作者: asdf2110    时间: 2014-11-10 10:45
标题: 请教一个InnoDB的辅助索引问题
本帖最后由 asdf2110 于 2014-11-10 11:10 编辑

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

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

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

作者: 秦风笛韵1    时间: 2014-11-10 13:03
本身innodb是以主键为主排序的表。。所以对于innodb来讲,其在磁盘的排序已经由主键的顺序定了,不能再按其它健排序。

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

根本原因是INNODB是主键的索引组织表,其物理存储已经由主键决定,不能再改变在磁盘中的存储顺序。
作者: asdf2110    时间: 2014-11-10 13:13
“一个磁盘块能存储更多的键值”
这个未必吧,还得取决于主键和地址的大小,地址一般由 文件号+块号+块内偏移组成,大概10个字节
不过也可以作为一个考虑因素,谢谢你的回复


回复 2# 秦风笛韵1


   
作者: action08    时间: 2014-11-24 19:16
没有读过相关的结构,数据库本身就是让我们方便来用的


两次索引其实没有想的那么慢,辅助索引理论上应该能够指到文件系统的记录位置
作者: action08    时间: 2014-11-24 19:17
这涉及到mysql具体实践的问题了,还是请读过相关源代码的同学分享吧
作者: 淡定与洒脱    时间: 2014-11-25 23:46
个人也觉得是跟DML有关,当对一个innodb表进行大量DML后,B+树会分裂,同一行记录的页地址会发生变化。
由于辅助索引记录的是主键值,因此完全不用理会这个变化,如果辅助索引记录的是实际页地址,那DML一旦引起B+树分裂,还得与辅助索引进行同步。
作者: wang1352083    时间: 2014-11-27 10:10
回复 1# asdf2110

好高端的问题,我只是使用,还真么有研究这么细,可能和我们的应用小有关
   
作者: psufnxk2000    时间: 2014-11-27 23:21
应该是索引上没有位置标识




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2