终极串讲:聚簇索引 + 二级索引 + 回表 + 索引下推
(面试背这一套,MySQL 索引题直接满分)
我先把 回表 用最通俗的话讲清楚,再把整套逻辑串起来。
一、什么是 MySQL 回表?(最通俗解释)
一句话定义
回表 = 先查二级索引拿到主键,再拿主键去查聚簇索引,多跑一遍索引树。
生活类比
- 聚簇索引 = 书的正文本身
- 二级索引 = 书的目录(只写了页码)
你查目录:
- 目录告诉你:目标在 第 88 页
- 你必须翻到 第 88 页 才能看到完整内容
这个"翻到正文"的动作,就是回表。
二、回表底层原理(面试版)
- 二级索引叶子节点只存主键
- 你用二级索引查询时,只能拿到主键
- 想拿到整行数据(name, age, city...)
- 必须再用主键查一次聚簇索引
这个第二次查询 的过程,就是 回表。
三、什么时候会回表?
只要你用 二级索引 查询,且 查询的字段不在索引里,就一定会回表。
sql
select * from user where name = "张三";
- name 是二级索引
- 查的是 *
- 必须回表
四、什么时候不回表?
覆盖索引 :查询的字段全部在二级索引里,不用去聚簇索引查。
sql
select id, name from user where name = "张三";
二级索引已经包含 name + id,直接返回,不回表。
五、整套串讲(面试官最爱听)
我给你整理成一段可以直接背的完整逻辑:
1. 聚簇索引
InnoDB 的聚簇索引叶子节点就是整行数据 ,
一个表只有一个,就是主键索引,
查询直接拿数据,不回表。
2. 二级索引
二级索引叶子节点只存主键值 ,
不存完整数据,
所以查询必须回表。
3. 回表
先查二级索引拿到主键,
再拿主键查聚簇索引拿完整数据,
多一次IO,性能变差。
4. 索引下推(ICP)
ICP 不能解决最左前缀问题 ,
不能让跳字段用上索引。
但 ICP 能在二级索引遍历的时候,提前过滤不满足条件的行 ,
减少回表次数,提升性能。
六、最精炼满分总结(30 秒口述版)
InnoDB 聚簇索引叶子节点存整行数据,二级索引只存主键。
用二级索引查询时,需要通过主键再查聚簇索引拿完整数据,这个过程叫回表 。
回表会增加IO,影响性能。
索引下推 不能解决最左前缀的问题,但能在索引层面提前过滤无效数据,减少回表次数,优化查询效率。
七、你问的关键题(面试官必问)
Q:索引下推是不是解决了联合索引跨字段查询的缺点?
A:不是。
索引下推不能解决最左前缀 导致的跳字段无法使用索引的问题。
它只是减少回表次数,让已使用的索引查询更快。