主题
面试速答(先看这里)
**一句话结论:**在存储的数据方面,主键(聚簇)索引的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 查询语句,只用到非聚簇索引而不需要用到聚簇索引,那么就可能是发生了索引覆盖或者索引下推。(这也是个单独的面试题)