用 EXPLAIN ANALYZE 和优化器跟踪调试糟糕的执行计划
MySQL性能命令
-- Plan + actual time and rows (the query actually runs)
EXPLAIN ANALYZE
SELECT region, COUNT(*) FROM shop.big WHERE id < 20000 GROUP BY region;
-- Why the optimizer chose this plan: optimizer trace
SET SESSION optimizer_trace = 'enabled=on', SESSION optimizer_trace_max_mem_size = 1048576;
SELECT * FROM shop.big WHERE region = 'TR' AND id > 100 LIMIT 5;
SELECT JSON_PRETTY(JSON_EXTRACT(TRACE, '$**.considered_execution_plans')) AS plans,
MISSING_BYTES_BEYOND_MAX_MEM_SIZE
FROM information_schema.OPTIMIZER_TRACE;
SET SESSION optimizer_trace = 'enabled=off';作用
EXPLAIN ANALYZE 针对每个计划步骤并列显示估算值(cost、rows)和实际值(actual time、rows、loops);优化器跟踪显示考虑过的访问路径、其成本以及每条路径被选中或被拒绝的原因。
适用场景
查询突然变慢(执行计划变化)、优化器选错索引,或要查找估算行数与实际行数不符的根源时。
注意
EXPLAIN ANALYZE 会真正执行查询;在生产环境中对重型查询要谨慎。它适用于 SELECT、TABLE 以及多表 UPDATE / DELETE。估算行数与实际行数相差 10 倍以上说明统计信息/直方图有问题(ANALYZE TABLE、直方图)。在嵌套循环的内侧,actual rows 是每次循环的值;总数 = rows × loops。若 MISSING_BYTES_BEYOND_MAX_MEM_SIZE > 0,跟踪被截断;请调大 optimizer_trace_max_mem_size。跟踪只保存同一会话的最后一条语句。