InnoDB为何不在二级/非聚簇索引中存储行指针?
为什么InnoDB二级索引存储主键而非行指针?
行物理位置并非固定
InnoDB的聚簇索引会随着数据插入、行长度更新或页分裂操作改变行的物理存储位置。如果二级索引存的是行的物理指针(比如磁盘页偏移),那每次行位置变动,所有包含该行的二级索引条目都得更新,这会带来巨大的IO和锁开销,严重影响性能。而主键是行的唯一逻辑标识,只要主键不变,不管行移到哪,通过主键都能在聚簇索引中找到它,二级索引完全不用改动。大幅节省存储空间
二级索引往往不止一个,每个二级索引的条目越小,整个索引占用的磁盘空间和内存缓存就越少。相比固定长度的行指针(通常6字节左右),主键可以选用更小的数据类型(比如INT占4字节),就算是BIGINT(8字节),在多个二级索引的场景下,累加的空间节省也很可观。更小的索引意味着缓存命中率更高,查询速度更快。保证数据一致性
若使用行指针,行位置变动时如果有某个二级索引没及时更新,就会出现索引指向无效地址的情况,导致数据不一致。而依赖主键的话,只要主键是唯一且稳定的,通过聚簇索引的查找路径始终有效,从根本上避免了这种一致性问题。
内容的提问来源于stack exchange,提问作者choxsword
相关产品推荐
相关产品推荐

