在 MySQL 中,二级索引是否同样受到 MVCC 多版本并发控制机制的快照保护?
考察说明
考察候选人对 MySQL 二级索引与 MVCC 快照机制关系的理解程度。
回答思路
- 【回答框架 1】MVCC 的核心是每行记录携带隐藏字段,包括事务 ID 与回滚指针,用于实现快照读与版本链回滚。二级索引本身不直接存储这些版本信息,它只是指向聚簇索引的主键值。
- 【回答框架 2】查询使用二级索引时,会通过索引定位到主键,再回表到聚簇索引读取行记录。快照读依赖的版本信息在聚簇索引的行记录中,因此二级索引本身没有独立的快照版本数据。
- 【回答框架 3】在 MVCC 下,二级索引的查询需要回表验证可见性。如果二级索引中的主键对应行已被更新或删除,InnoDB 会通过聚簇索引的版本信息判断该版本对当前事务是否可见。
- 【回答框架 4】对于覆盖索引场景,如果查询字段完全包含在二级索引中,理论上可以不回表,但 InnoDB 仍需检查行是否对当前事务可见,因为索引页中可能包含已经提交或未提交的版本信息,但在实践中基于快照读通常可直接判断可见性。
- 【回答框架 5】需要明确,MVCC 快照是事务级别的可见性快照,而非物理数据快照。二级索引物理上只有当前版本的数据,但通过行版本链和事务隔离级别,能实现逻辑上的多版本快照读。
- 【关键点 1】二级索引不直接存储版本信息,版本信息在聚簇索引行记录中。
- 【关键点 2】MVCC 快照读作用于聚簇索引,通过回表验证可见性。
- 【关键点 3】覆盖索引仍需考虑可见性,但仅在聚簇索引访问时应用版本链。
- 【易错点 1】误以为二级索引独立维护版本链。
- 【易错点 2】忽略回表操作在 MVCC 中的作用。
- 【易错点 3】将索引结构中的隐藏字段与版本信息混淆。