首页/数据/SQL 速查/覆盖索引避免回表
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条变更与事务52 条
性能与执行计划72 条

覆盖索引避免回表

查询需要的列都在索引中时,引擎可直接从索引返回结果(Extra 显示 Using index);InnoDB 二级索引天然包含主键列。

SQL 速查数据更新于 2026-10-12

示例

示例
ALTER TABLE orders ADD INDEX idx_user_created (user_id, created_at);

-- id 是主键:二级索引中包含主键列,这个查询可被覆盖
EXPLAIN SELECT id, user_id, created_at
FROM orders
WHERE user_id = 100
ORDER BY created_at;
-- Extra: Using index

-- 加上 total 列后需要回表(除非把 total 也放进索引)
EXPLAIN SELECT total FROM orders WHERE user_id = 100;
判定依据EXPLAIN 的 Extra 是否出现 Using index
InnoDB 特性二级索引尾部隐含主键列,SELECT id 常可被覆盖
PostgreSQL对应 Index Only Scan 与 INCLUDE 覆盖列

易错点

  • 用 SELECT * 谈覆盖索引:列越多越难全覆盖,需要显式列出查询列
  • 在写多读少的表上为覆盖而叠列:索引越宽写入维护成本越高,要按读写模式权衡

数据来源与参考

  • MySQL 8.0 Reference Manual §8.3.1 How MySQL Uses Indexes
  • MySQL 8.0 Reference Manual §8.8.2 EXPLAIN Output Format
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌