直接回答:覆盖索引指查询所需的全部列都包含在某个二级索引中(索引列+主键列),无需回表到聚簇索引取整行,直接从索引就能返回结果。EXPLAIN 的 Extra 出现 Using index 即命中。
展开解析:性能提升来自三点:
- 少一次 B+ 树查找:省掉回表的随机 IO,二级索引页通常比数据页小,同样内存能缓存更多。
- 索引顺序 IO 优于回表的随机 IO:尤其二级索引非连续主键时,回表是大量离散读。
- 配合索引下推(ICP)还能在引擎层提前过滤。
实践要点:为高频查询建"包含 SELECT 列"的联合索引是常用优化,例如 SELECT id, name FROM t WHERE age=? 建 (age, name);但不要为覆盖而无脑加宽索引——索引越宽,写入维护成本越高、单页容纳条目越少。EXPLAIN 验证是否真正命中。
-- 联合索引 (age, name) 覆盖以下查询
SELECT id, name FROM users WHERE age = 30; -- Extra: Using index
追问方向:覆盖索引与回表、与 ICP(Using index condition)的区别。