首页/数据/SQL 速查/EXPLAIN Extra 常见标记解读
性能与执行计划72 条

EXPLAIN Extra 常见标记解读

Using index、Using where、Using index condition、Using filesort、Using temporary:Extra 说明过滤与排序发生在哪一层。

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

Extra 列是什么

MySQL 的 EXPLAIN 输出里,Extra 用简短文字说明过滤与排序发生在哪一层:存储引擎层还是 Server 层,需不需要回表,有没有额外的排序或临时表。它比 type 列更接近性能真相,慢查询定位通常从这里开始。

基本信息

Using where存储引擎返回行后,Server 层还要按 WHERE 再过滤
Using index覆盖索引:查询所需列都在索引里,不需要回表
Using index condition索引条件下推:部分条件下推到引擎层完成过滤
Using filesort需要额外排序步骤,数据量大时会用到磁盘
Using temporary使用内部临时表,常见于 GROUP BY、DISTINCT、UNION
Using join buffer连接使用连接缓冲;标注 hash join 的是 8.0.18+ 哈希连接
Using index for skip scan8.0.13+ 跳跃扫描,未用前导列也能利用后续列

两个典型例子

两个典型例子
EXPLAIN SELECT user_id, COUNT(*) FROM orders GROUP BY user_id;
-- Extra 可能是:Using index; Using temporary
-- 含义:查询列被索引覆盖,但仍需临时表完成分组

EXPLAIN SELECT * FROM orders WHERE user_id = 100 ORDER BY created_at LIMIT 10;
-- Extra 可能是:Using where; Using filesort
-- 含义:还需要回表,并且排序没能借助索引顺序完成

常见标记与含义

标记含义优化提示
Using whereServer 层还有过滤条件让过滤列尽量进入索引
Using index覆盖索引,无需回表SELECT 写明确列名更容易达成
Using index condition索引条件下推生效减少回表次数,通常是好事
Using filesort存在额外排序步骤让 ORDER BY 与索引顺序一致
Using temporary使用内部临时表优化分组键或补充索引
Using join buffer (hash join)使用哈希连接等值连接缺少索引时的兜底方案

典型使用场景

  • 慢查询定位:先看 type 再读 Extra,判断瓶颈在哪一层
  • 索引评审:确认新加的索引是否被用上、是否达成覆盖
  • 排序优化:消除 filesort,让 ORDER BY 顺着索引顺序走
  • 分组优化:减少 Using temporary 的出现频率
  • 上线前回归:对比优化前后 Extra 的变化
  • 向同事解释执行计划:Extra 是最直观的证据
Extra 里同时出现 Using index 与 Using where 并不矛盾:前者说明查询列被索引覆盖、不用回表,后者说明仍有过滤动作发生在 Server 层,两件事互相独立,可以同时成立。
Using filesort 不代表一定用了磁盘:排序数据量小于排序缓冲区时是在内存里完成的。先看扫描行数与结果行数,再决定是否为消除排序去调整索引。

易错点

  • 只看 type 不看 Extra:type 显示 ref 也可能同时伴随 filesort 与临时表,性能瓶颈常在这里
  • 把 Using temporary 一律当故障:小结果集使用内存临时表很常见,要结合数据量与调用频率判断
  • 看到 Using index 就认为已经最优:它只说明不用回表,行数多时仍然要扫大量索引条目
  • 为消除 filesort 乱加索引:排序键与过滤键的列顺序不同,加错索引反而增加写放大

数据来源与参考

  • MySQL 8.0 Reference Manual §8.8.2 EXPLAIN Output Format(Extra 列)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌