在mysql数据库的日常使用中,SQL执行效率低下是常见的问题,想要精准定位性能瓶颈,就需要清楚SQL从解析到执行每个阶段的耗时情况。optimizer_trace是mysql官方提供的内置性能分析工具,能够完整记录SQL语句的解析、优化、执行全过程的详细数据,包括每个环节的耗时、优化器的决策依据等信息,是追踪SQL解析过程耗时的有效工具。

optimizer_trace的基本介绍
optimizer_trace是mysql 5.6版本及以上引入的功能,默认处于关闭状态,它会在SQL执行时生成一份详细的跟踪报告,报告中包含了SQL解析阶段的所有操作细节,比如语法解析、语义检查、查询优化、执行计划生成等环节的耗时和具体逻辑。通过这份报告,我们可以清晰看到SQL解析过程中哪个步骤消耗了最多的时间,从而针对性地进行优化。
开启和使用optimizer_trace的步骤
1. 开启optimizer_trace功能
首先需要开启optimizer_trace的跟踪功能,执行以下SQL语句即可:
-- 开启optimizer_trace,设置跟踪范围为当前会话 SET optimizer_trace="enabled=on"; -- 可选:设置跟踪的最大内存大小,默认是16KB,若SQL复杂可适当调大 SET optimizer_trace_max_mem_size=102400;
2. 执行需要分析的SQL语句
开启跟踪功能后,执行你想要分析耗时的SQL语句,比如一条查询语句:
SELECT * FROM user_table WHERE age > 20 AND city = "北京" ORDER BY create_time DESC LIMIT 10;
3. 查看optimizer_trace跟踪结果
SQL执行完成后,通过查询information_schema.OPTIMIZER_TRACE表来获取跟踪报告:
SELECT * FROM information_schema.OPTIMIZER_TRACE;
4. 关闭optimizer_trace功能
分析完成后,建议关闭跟踪功能,避免不必要的性能开销:
SET optimizer_trace="enabled=off";
解读跟踪结果中的SQL解析耗时
查询得到的跟踪报告是一个JSON格式的内容,其中steps字段包含了SQL处理的所有阶段,SQL解析相关的耗时主要集中在以下几个部分:
- join_preparation:SQL准备阶段,包含语法解析、语义检查等操作,这里的耗时就是SQL解析过程的核心耗时。
- join_optimization:查询优化阶段,优化器会生成多个可能的执行计划并选择最优的一个,这个阶段的耗时也和解析过程密切相关。
- join_execution:SQL执行阶段,不属于解析过程,可忽略。
每个阶段下都有cost_info字段,其中的query_cost就是该阶段的预估成本,结合阶段执行的时间,就能明确SQL解析过程的耗时分布。比如如果join_preparation阶段的query_cost很高,说明SQL本身的语法或者表结构可能存在问题,导致解析耗时过长。
实际分析示例
假设我们执行了一条复杂的联表查询SQL,通过optimizer_trace得到的join_preparation阶段内容如下:
{
"join_preparation": {
"select#": 1,
"steps": [
{
"expanded_query": "/* select#1 */ select `user_table`.`id` AS `id`,`user_table`.`name` AS `name`,`order_table`.`order_no` AS `order_no` from `user_table` join `order_table` on (`user_table`.`id` = `order_table`.`user_id`) where (`user_table`.`age` > 20) and (`order_table`.`status` = 1)"
}
],
"cost_info": {
"query_cost": "12.50"
}
}
}
这里的query_cost为12.50,说明准备阶段的解析成本为12.50,如果这个值远高于同类型简单SQL的成本,就需要检查SQL是否存在不必要的复杂逻辑,比如多余的联表、错误的函数使用等,这些都可能导致解析耗时增加。
使用注意事项
- optimizer_trace会消耗一定的系统资源,不要在生产环境长期开启,仅在做性能分析时临时开启。
- 如果SQL非常复杂,跟踪报告可能会很大,需要适当调大
optimizer_trace_max_mem_size参数,避免报告被截断。 - 跟踪结果中的成本是优化器的预估值,和实际耗时可能存在偏差,需要结合实际的执行时间一起分析。
- 仅支持mysql 5.6及以上版本,低版本无法使用该工具。
需要注意的是,SQL解析耗时只是SQL执行总耗时的一部分,如果解析耗时正常但总耗时很高,还需要结合执行阶段的索引使用情况、数据量等因素进一步分析。
mysqloptimizer_traceSQL解析性能优化修改时间:2026-06-20 13:27:27