跳转至

回表、覆盖索引与索引下推

一、回表

二级索引叶子节点存的是主键值。查到二级索引后,还要拿主键再去聚簇索引查整行——这就是回表

二级索引 name → 查到 id=1
聚簇索引 id=1 → 拿到整行

二、覆盖索引

如果查询的列都在索引里,不用回表:

SELECT id, name FROM user WHERE name = '张三';
-- 索引 (name, id) 覆盖了,不用回表

Extra 显示 Using index

三、索引下推(ICP)

MySQL 5.6+:

SELECT * FROM user WHERE name LIKE '张%' AND age = 18;

联合索引 (name, age):

  • 没有 ICP:先用 name 找到所有"张"开头,回表,再在 server 层过滤 age。
  • 有 ICP:在索引遍历时就过滤 age,减少回表次数。

Extra 显示 Using index condition

四、对比

含义
回表 二级索引查主键再查聚簇索引
覆盖索引 查询列都在索引里,不回表
索引下推 索引遍历时先过滤,减少回表

五、怎么避免回表

  • 建联合索引,覆盖查询列。
  • 用覆盖索引。

面试一句话

覆盖索引不回表,索引下推少回表。