当前位置: 首页 > news >正文

执行计划深度解析:从 type 到 Extra,榨干 EXPLAIN 的价值

关键词​:EXPLAIN;执行计划;type;Extra;SQL优化;索引


大家好,我是小耶,写功课只是为了我踩过的坑,你们别再踩了!

你肯定用过EXPLAIN看 SQL 的执行计划,但你有没有真正看全过?type到底有几种取值?Extra里的Using indexUsing whereUsing temporaryUsing filesort分别什么意思?key_len怎么算?filtered有什么用?今天我们就来把EXPLAIN的输出彻底讲透。

用“快递分拣系统”来类比理解执行计划​:

  • type相当于分拣效率:最快的是“直接按门牌号送”(const),最慢的是“翻遍整个仓库”(ALL)。
  • possible_keys= 可能用的传送带,key= 实际选的传送带。
  • rows= 需要检查的包裹数量。
  • filtered= 初步分拣后还需要人工二次分拣的比例。
  • Extra= 额外操作标记,如“用了传送带但还要人工挑拣”(Using where)、“需要临时堆货”(Using temporary)。

一、EXPLAIN 输出列完整解读

我们用EXPLAIN SELECT ...会得到一张表,每个列的含义如下:

列名含义关键点
idSELECT 的标识序号越大越先执行;相同则从上到下
select_type查询类型SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION 等
table表名或别名可能是临时表名()
partitions匹配的分区分区表时有用
type连接类型(重要)性能从好到差:system > const > eq_ref > ref > range > index > ALL
possible_keys可能使用的索引列出候选索引
key实际使用的索引如果 NULL 表示没用到索引
key_len使用索引的长度(字节)判断联合索引用了多少列
ref索引列与哪个值比较常量 const 或 列名
rows预估需要扫描的行数越大越差
filtered存储引擎返回的行中满足剩余条件的比例100% 最好
Extra额外信息Using index、Using where、Using temporary、Using filesort 等

二、type 详解:性能的关键指标

type 表示 MySQL 如何查找表中的行,按性能从最优到最差排序:

type含义示例出现条件
system系统表,只有一行极少见系统表或 const 的特例
const最多匹配一行,用主键或唯一索引等值查询WHERE id = 1主键或唯一索引,且查询结果为常量
eq_ref使用唯一索引进行关联,每个关联只返回一行JOIN ... ON t1.id = t2.id且 t2.id 是主键被驱动表使用主键或唯一索引连接
ref使用非唯一索引或前缀索引进行等值匹配WHERE name = 'abc'(name 有普通索引)索引列不是唯一或可为 NULL
range索引范围扫描WHERE id BETWEEN 1 AND 100IN><索引列上的范围条件
index全索引扫描索引覆盖但没过滤条件遍历整个索引树
ALL全表扫描(最差)无索引或优化器认为全表更快大表且无有效索引

优化目标​:至少达到range级别,争取达到refconst

案例​:

-- type = ALL 很差 EXPLAIN SELECT * FROM orders WHERE amount > 100; -- 添加索引后 type 变为 range ALTER TABLE orders ADD INDEX idx_amount(amount);

三、Extra 详解:优化器还做了什么?

Extra 列包含关于查询执行的额外信息,很多关键优化线索都在这里:

Extra 信息含义优劣优化方向
Using index使用了覆盖索引,不回表✅ 好继续保持
Using where存储引擎返回后在 Server 层过滤🟡 普通尝试将过滤条件移到索引中
Using temporary使用了临时表(通常用于 GROUP BY 或 DISTINCT)⚠️ 差优化 GROUP BY/ORDER BY 或加索引
Using filesort需要额外排序,不能利用索引排序⚠️ 差对 ORDER BY 列加索引
Using index condition使用索引下推(ICP)✅ 好MySQL 5.6+ 自动优化
Using join buffer连接使用了 Buffer(Block Nested Loop)🟡 普通加索引避免 Buffer
Impossible WHEREWHERE 条件永远为假无需优化检查 SQL 逻辑
No tables used没有 FROM 或 FROM DUAL--

注意​:Using filesort不是真的用文件,而是指无法利用索引排序,需要在内存或磁盘中排序。当排序结果集大时很慢。

案例​:

-- Using filesort EXPLAIN SELECT * FROM orders ORDER BY create_time; -- 加索引后 Using filesort 消失 ALTER TABLE orders ADD INDEX idx_create_time(create_time);

四、组合索引与 key_len 实战

key_len表示 MySQL 在索引中实际使用的字节数。通过它可判断联合索引使用了多少列。

计算规则​:

  • 列长度:INT=4, BIGINT=8, DATE=3, TIMESTAMP=4, CHAR(n)=n×字符集字节数(utf8mb4=4),VARCHAR(n)=n×4+2。
  • 允许 NULL 额外 +1。

示例​:索引(user_id, log_date, type),user_id INT NOT NULL (4),log_date DATE NOT NULL (3),type TINYINT (1)。查询WHERE user_id=1 AND log_date='2026-06-01'key_len=4+3=7,说明用到了前两列。

联合索引使用原则​:最左前缀,且中间的列不能跳过。如果跳过了某列,后面的列不会被使用。


五、filtered 的作用

filtered表示存储引擎返回的行中,满足剩余 WHERE 条件的比例(估算)。100% 表示所有返回行都满足条件。如果 filtered 很小(如 10%),说明索引过滤后还要过滤掉 90% 的行,回表成本高。

用法​:在 JOIN 中,驱动表的 filtered 值直接影响被驱动表的读取次数。


六、实战案例优化全过程

原始 SQL​:

SELECT * FROM orders WHERE customer_id = 12345 AND status = 'PAID' AND create_time > '2026-01-01' ORDER BY create_time DESC LIMIT 10;

原执行计划​:type=ref,key=customer_id,rows=1000,Extra=“Using where; Using filesort”。

问题分析​:

  • 用了 customer_id 索引,但 status 和 create_time 过滤在回表后执行。
  • filesort 因为 create_time 没在索引中用于排序。

优化方案​:建立联合索引(customer_id, status, create_time)

新执行计划​:type=ref,key=联合索引,key_len=4+?+3,Extra=无 filesort(因为索引已排序)。

效果​:查询从 0.5 秒降到 0.02 秒。


七、总结与实用检查清单

阅读EXPLAIN时按以下顺序检查:

  1. type​:是否出现了 ALL 或 index?如果是,考虑加索引。
  2. key​:是否为 NULL?是则索引没用上。
  3. rows​:是否远大于预期?检查索引选择性。
  4. Extra​:是否出现 Using temporary 或 Using filesort?优化排序和分组。
  5. filtered​:是否低于 30%?检查索引是否能覆盖更多过滤条件。

小耶在手,SQL 不愁

还有什么想了解的,欢迎留言!小耶一定知无不言言无不尽……我们下次见~

参考文献

  1. MySQL官方文档:《EXPLAIN Output Format》
  2. 《高性能MySQL》第4版,第9章:查询优化
http://www.jsqmd.com/news/988675/

相关文章:

  • AD生成图形交互式bom表的方法
  • 北京配眼镜功能性镜片怎么选,五类场景逐一对照 - 配眼镜新资讯
  • 网盘直链下载助手终极指南:免费获取八大网盘真实下载地址
  • 五指毛桃赤小豆膏:从古籍配伍到现代轻养生的配方逻辑
  • 测评|苏州外贸工厂做GEO应该怎么选服务商?靠谱GEO服务商推荐? - 极义GEO
  • i.MX 8ULP硬件设计:电源时序与未用接口处理实战指南
  • 终极Qobuz无损音乐下载器:专业级音乐库构建完整指南
  • 数据的加密与解密(23:22)
  • 完整指南:在macOS上轻松运行Windows程序的终极解决方案
  • 压敏电阻 Cp 参数怎么看?电源端与信号端应用差异解析
  • DBHub:一款免费开源的数据库MCP服务器
  • Dify日志与标注时间显示问题
  • 从“盲跑”到“智控”:耐高温RFID驱动喷涂线柔性升级
  • 硫酸钙防静电地板防潮原理揭秘!华竞公司产品实际应用效果如何
  • 小说阅读器,真好用
  • 一分钟学会 Guice - 简单的 Java 依赖注入框架
  • ChatGPT Plus、Claude Pro、Gemini Pro 怎么选?国内用户别乱花钱
  • 2026年AI大模型接口调度服务全维度实测:主流服务商性能对比与高性价比选型参考
  • 5 分钟上手:为 Cline 配置一个免费的 MCP 天气服务
  • 前端免费高效的接入天气组件(天气网),控制组件的样式
  • 亚马逊流量转化专家哪家强?资深行业大咖与实战品牌盘点
  • 电力电子技术:源网荷储系统的关键装备
  • 2026年重庆保姆服务TOP榜单:钟点家姆/住家保姆/育儿陪护/养老做饭阿姨精选推荐与口碑解析 - 企业推荐官【官方】
  • Agent应用指南:利用GET请求获取理想汽车门店位置信息
  • 智谷洞察|十五五央国企品牌工作的思考与解读之(四):品牌出海,不仅要“走出去”更要“走进去”
  • MarkItDown:把世界上的文件变成 LLM 爱读的 Markdown
  • 2026年实测AI论文网站指南(合规高效版)
  • 谱梦AI + 音乐:手把手教你用 AI 工具生成原创音乐并上传到汽水音乐
  • 2026年青岛低价企业管理内训靠谱吗?这些判断技巧帮你辨清优劣
  • 2026重庆除甲醛公司真实有效推荐,附加推荐理由! - 空气捍卫者