【性能优化必备】什么是覆盖索引?为什么它查询快?
👉 “什么是覆盖索引?为什么它比普通索引快?”
很多人一脸迷茫:
“是不是说索引把数据都覆盖了?”
其实,覆盖索引是 MySQL 提升查询效率的一大利器,今天我们来彻底讲清楚!
一、什么是覆盖索引?
📌 定义:
如果一个查询所需的字段 都能从索引中获取,不需要回表,就叫做 覆盖索引(Covering Index)。
👉 通俗理解:
-
• 普通索引查询:查到主键,还得去表里“翻书”取数据(回表)。 -
• 覆盖索引查询:索引里已经有你要的字段,直接返回,一步到位!
二、覆盖索引的例子
假设有一个用户表:
CREATE TABLE user (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
email VARCHAR(100),
INDEX idx_name_age (name, age)
);
普通查询(需要回表)
SELECT * FROM user WHERE name='Tom';
-
• idx_name_age索引能定位到主键id, -
• 但 *要返回所有字段,还需要回表。
覆盖索引查询(不用回表)
SELECT name, age FROM user WHERE name='Tom';
-
• 查询的字段 刚好在 idx_name_age索引里, -
• 不用再去主键索引找整行数据,直接返回。 -
• 效率更高!
三、覆盖索引的优势
-
1. 避免回表,减少 IO -
• 索引树比数据表小,扫描更快。 -
2. 提升查询效率 -
• 直接从索引返回结果,减少磁盘读取。 -
3. 减少锁竞争 -
• InnoDB 二级索引覆盖查询时,不用访问主键页,减少锁冲突。
四、使用覆盖索引的注意事项
-
1. SELECT 的字段要包含在索引里 -
• 只要有一个字段不在索引中,就需要回表。 -
2. 尽量用联合索引 -
• 常见查询字段可以建组合索引,提高覆盖率。 -
3. **避免 SELECT *** -
• SELECT *会破坏覆盖索引优化,因为它要全字段。
五、实战技巧
-
• ✅ 写 SQL 时,多用 精确字段查询(比如 SELECT name, age),
避免SELECT *,更容易触发覆盖索引优化。 -
• ✅ 建立合理的 联合索引,让常用查询直接命中覆盖索引。 -
• ✅ 使用 EXPLAIN查看执行计划,如果 Extra 列有Using index,说明用了覆盖索引。
👉 示例:
EXPLAIN SELECT name, age FROM user WHERE name='Tom';
输出:
Extra: Using index
这就是覆盖索引!
六、总结一句话
-
• 覆盖索引 = 查询字段完全包含在索引里 -
• 好处:避免回表、减少 IO、查询更快 -
• 口诀:
👉 字段都在索引里 → 一步到位,不用回表
🎯 面试必备回答:
覆盖索引指的是查询的字段都能从索引中获取,而不需要回表。
它能减少磁盘 IO,提高查询效率,常见于联合索引场景。
使用时要注意 SELECT 精确字段,而不是 SELECT *。

