昨天发表的文章中,对比多种数据库对SQL的逻辑优化能力。有朋友留言谈到可以使用 MySQL Explan Analyze 方式查看执行情况,较为直观和准确。之前对这个命令了解不多,特测试了一下。本文简单总结下 Explan Analyze 的使用之法。
1. MySQL Explain Analyze 概述
EXPLAIN ANALYZE是MySQL 8.0.18引入的查询分析工具,它在传统EXPLAIN的基础上扩展了实际执行数据的统计功能。不仅生成查询计划,还会实际执行SQL语句,并输出每个执行算子(Iterator)的实际耗时、扫描行数、循环次数等详细信息,帮助开发者更精准地定位性能瓶颈。
(1)与Explain (Extended) 对比
这里与传统的 Explain 方法进行对比,这里引用来自DeepSeek的一段描述
总结来说,EXPLAIN ANALYZE 适合生产环境调优(但需注意真实执行开销),通过实际执行数据精准定位问题(如索引失效或统计信息偏差)。传统EXPLAIN,则适合快速验证查询计划,避免执行开销。EXPLAIN EXTENDED,在旧版本中用于深度分析优化器逻辑,现逐渐被FORMAT=JSON或FORMAT=TREE取代。
(2)Explain Analyze 示例
- 执行顺序:按照从右到左、从上到下来解析。以树状层级展示执行流程,直观显示操作顺序。
- 执行时间:分两段显示( actual time=0.0541..2.03),分别表示获取第一行和所有行的耗时。
- 预估成本:显示预估成本( cost=1019)
- 返回行数:显示预估行数( rows=10117)与实际返回行数(rows=10000),帮助发现统计信息偏差。
- 循环次数(loops=N):表示迭代器执行次数,尤其在嵌套循环连接中体现驱动表与被驱动表的关系。
(3)与传统输出执行计划对比
之前大家经常诟病的MySQL执行计划输出简单,解读困难;通过 Analyze 的方式不仅内容更加丰富,而且更容易解读。这里列一个稍微复杂的示例。
同样的语句用Analyze方式输出,细节丰富了很多。
2. 通过 Analyze 方式解读执行计划
Analyze 方式可以让我们更好地理解 MySQL 的执行过程,可与 Explain 配合来使用。下面通过几个典型示例,说明下使用 Analyze 的优点。
(1)表关联
针对表关联,一是区分关联类型(嵌套、哈希),一是区分驱动关系(驱动表、被驱动表)。这两点通过树形层次结构都体现的比较清晰。此外,包括内层循环次数等,也都一目了然。
(2)集合操作
原有输出中是通过ID来表示执行顺序的,不是很直观。在集合示例中,层次结构表达的执行次序很清晰。
(3)聚合函数
对于聚合函数而言,传统方式说明使用二级索引扫描的方式得到结果,但Analyze 方式反而没有,这里有点奇怪。