回表、覆盖索引与索引下推¶
一、回表¶
二级索引叶子节点存的是主键值。查到二级索引后,还要拿主键再去聚簇索引查整行——这就是回表。
二、覆盖索引¶
如果查询的列都在索引里,不用回表:
Extra 显示 Using index。
三、索引下推(ICP)¶
MySQL 5.6+:
联合索引 (name, age):
- 没有 ICP:先用 name 找到所有"张"开头,回表,再在 server 层过滤 age。
- 有 ICP:在索引遍历时就过滤 age,减少回表次数。
Extra 显示 Using index condition。
四、对比¶
| 含义 | |
|---|---|
| 回表 | 二级索引查主键再查聚簇索引 |
| 覆盖索引 | 查询列都在索引里,不回表 |
| 索引下推 | 索引遍历时先过滤,减少回表 |
五、怎么避免回表¶
- 建联合索引,覆盖查询列。
- 用覆盖索引。
面试一句话
覆盖索引不回表,索引下推少回表。