Skip to content

面试速答(先看这里)

**一句话结论:**在存储的数据方面,主键(聚簇)索引的B+树的叶子节点直接就是我们要查询的整行数据了。

60秒标准回答:

在 InnoDB 里,索引B+ Tree的叶子节点存储了整行数据的是主键索引,也被称之为聚簇索引。而索引B+ Tree的叶子节点存储了主键的值的是非主键索引,也被称之为非聚簇索引

在存储的数据方面,主键(聚簇)索引的B+树的叶子节点直接就是我们要查询的整行数据了。而非主键(非聚簇)索引的叶子节点是主键的值

那么, 当我们根据非聚簇索引查询的时候,会先通过非聚簇索引查到主键的值,之后,还需要再通过主键的值再进行一次查询才能得到我们要查询的数据。而这个过程就叫做回表

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**在 InnoDB 里,索引B+ Tree的叶子节点存储了整行数据的是主键索引,也被称之为聚簇索引。
  • **要点2:**那么, 当我们根据非聚簇索引查询的时候,会先通过非聚簇索引查到主键的值,之后,还需要再通过主键的值再进行一次查询才能得到我们要查询的数据。
  • **要点3:**所以,在InnoDB 中, 使用主键查询 的时候,是效率更高的, 因为这个过程不需要回表。
  • **要点4:**假如有一个SQL 查询语句,只用到非聚簇索引而不需要用到聚簇索引,那么就可能是发生了索引覆盖或者索引下推。

**记忆锚点:**覆盖索引 → InnoDB → Tree → SQL → 整行数据的是主键索引 → 键的值的是非主键索引

加分表达:

  • 另外,依赖 覆盖索引 、 索引下推 等技术,我们也可以通过优化索引结构以及SQL语句减少回表的次数。

追问准备:

  • 围绕「覆盖索引」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「InnoDB」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「Tree」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

在 InnoDB 里,索引B+ Tree的叶子节点存储了整行数据的是主键索引,也被称之为聚簇索引。而索引B+ Tree的叶子节点存储了主键的值的是非主键索引,也被称之为非聚簇索引。

在存储的数据方面,主键(聚簇)索引的B+树的叶子节点直接就是我们要查询的整行数据了。而非主键(非聚簇)索引的叶子节点是主键的值。

那么,当我们根据非聚簇索引查询的时候,会先通过非聚簇索引查到主键的值,之后,还需要再通过主键的值再进行一次查询才能得到我们要查询的数据。而这个过程就叫做回表。

所以,在InnoDB 中,使用主键查询的时候,是效率更高的, 因为这个过程不需要回表。另外,依赖覆盖索引、索引下推等技术,我们也可以通过优化索引结构以及SQL语句减少回表的次数。

假如有一个SQL 查询语句,只用到非聚簇索引而不需要用到聚簇索引,那么就可能是发生了索引覆盖或者索引下推。(这也是个单独的面试题)

扩展知识 ​

覆盖索引&索引下推 ​

📄 ✅什么是索引覆盖、索引下推?

打开文档:✅什么是索引覆盖、索引下推?