Yihui’s Blog

MySQL 二级索引有 MVCC 快照吗?

日期:2026-07-11
难度:中等
标签:#面试 #MySQL #InnoDB #MVCC #二级索引

一句话答案

二级索引记录本身不保存完整的 MVCC 版本链;InnoDB 用二级索引定位主键后,通常要回到聚簇索引按其隐藏事务字段和 undo 版本链做可见性判断,必要时继续找旧的二级索引记录。

面试口语版

MVCC 的核心版本信息在聚簇索引记录及 undo log 中。二级索引叶子节点只保存二级键和主键,不像聚簇记录那样直接带完整行版本信息。因此用二级索引做一致性读时,先命中二级索引,再回表检查聚簇索引当前版本是否对 Read View 可见;如果不可见,会沿 undo 链构造可见旧版本。更新二级索引键时,旧二级索引记录也会在 purge 前保留,以免旧快照漏数据。这也是二级索引范围扫描可能出现额外回表和过滤的原因。

关键细节

  • 不能简单说“二级索引没有 MVCC”;正确说法是:可见性判定以聚簇索引版本链为核心,二级索引需要配合回表和延迟清理支持快照。
  • 覆盖索引在特定优化场景可减少回表,但不要把它误解为二级索引拥有完整版本链。
  • 更新二级索引列比更新非索引列带来更多索引维护成本。

面试官追问

  1. 为什么二级索引叶子节点保存主键而非行地址?
  2. 二级索引记录何时能被 purge?
  3. 覆盖索引的一致性读一定不回表吗?

学习清单

  • 将“索引定位”和“版本可见性判断”分开讲。
维护与整理 · Yihui在 GitHub 上编辑

继续阅读

浏览全部文章

SQL与NoSQL有什么区别?MySQL和MongoDB如何选型?实际项目中如何选择?

日期:2026-09-27 标签:#面试 #MySQL #数据库 难度:简单 来源:牛面 MySQL 题库 答案说明:独立整理(站内题目标记为 VIP,未读取会员答案) 一句话答案 MySQL与MongoDB的主要差异在数据模型、事务边界、查询方式和模式演化;按业务访问模式和一致性需求选型。 面试口语版(约 60…

阅读全文