分析利器 — MySQL Explain Analyze
昨天发表的文章中,对比多种数据库对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 示例之前大家经常诟病的MySQL执行计划输出简单,解读困难;通过 Analyze 的方式不仅内容更加丰富,而且更容易解读。这里列一个稍微复杂的示例。
同样的语句用Analyze方式输出,细节丰富了很多。
2. 通过 Analyze 方式解读执行计划
Analyze 方式可以让我们更好地理解 MySQL 的执行过程,可与 Explain 配合来使用。下面通过几个典型示例,说明下使用 Analyze 的优点。
(1)表关联针对表关联,一是区分关联类型(嵌套、哈希),一是区分驱动关系(驱动表、被驱动表)。这两点通过树形层次结构都体现的比较清晰。此外,包括内层循环次数等,也都一目了然。
原有输出中是通过ID来表示执行顺序的,不是很直观。在集合示例中,层次结构表达的执行次序很清晰。
对于聚合函数而言,传统方式说明使用二级索引扫描的方式得到结果,但Analyze 方式反而没有,这里有点奇怪。