对同一条查询跑EXPLAIN和EXPLAIN ANALYZE,量化本系列此前发现的优化器统计偏差——估算的98851行 vs 执行后的189960行。
EXPLAIN只是生成计划、估算代价,不会真正执行;EXPLAIN ANALYZE会执行这条查询,把估算和数字放在一起。
代码EXPLAIN SELECT * FROM t3b WHERE status='active'; EXPLAIN ANALYZE SELECT * FROM t3b WHERE status='active';
这张表本文在讲选择性那篇里测过:active占95%,但优化器一直低估。
结果EXPLAIN: → Index lookup on t3b using idx_status (status = 'active') (cost=11736 rows=98851) EXPLAIN ANALYZE: → Index lookup on t3b using idx_status (status = 'active') (cost=11736 rows=98851) (actual time=1.24..218 rows=189960 loops=1)
数字对比:EXPLAIN估算这条查询会命中98851行,EXPLAIN ANALYZE执行后,actual 部分显示命中了189960行——估算值只有值的约52%,接近腰斩。这跟本系列"选择性"那篇里发现的优化器统计偏差是同一个根源:这张表status列95%对5%的极端倾斜分布,采样统计没能准确捕捉到这个比例。
actual time=1.24..218,这两个数字分别是什么。
actual time=1.24..218 是"这个执行步骤第一次产生结果的时间"和"这个步骤全部完成的时间"(单位毫秒),rows=189960 是这个步骤处理的行数,loops=1 是这个步骤被执行了几次(对于外层循环里的内层步骤,loops经常会大于1)。这些数字全部来自这条查询真的执行了一遍之后统计出来的运行时数据,不是理论估算——这也是为什么 EXPLAIN ANALYZE 对于排查"执行计划明明看起来对,但跑起来很慢"这类问题特别有用:它能告诉你计划里的每一步,估算和实际到底差在哪一环。
EXPLAIN ANALYZE 会让这条查询执行一遍——如果这条查询本身是个昂贵的写操作或者很慢的报表查询,用EXPLAIN ANALYZE去排查等于是又跑了一遍这个昂贵操作,线上环境对这一点要有心理准备,不是一个"零成本"的诊断工具。
每一步都是本文上面用EXPLAIN和EXPLAIN ANALYZE跑出来的原始结果。
EXPLAIN vs EXPLAIN ANALYZE:对比估算和实际执行数字