标准答案
- 先看实际总耗时、返回行数和最重的节点,再从根节点向下比较计划估算 rows 与实际 rows,寻找估算偏差和中间结果膨胀。
- loops 表示节点被重复执行的次数,节点显示的 actual time 通常是单次或累计语义,需要结合 loops 判断真正成本。
- BUFFERS 可以区分 shared hit、read、dirtied、written 等缓冲行为;配合 track_io_timing、磁盘指标和缓存状态,才能判断是否由 I/O 主导。
- EXPLAIN ANALYZE 会实际执行语句,UPDATE、DELETE 和带副作用的函数尤其危险;生产环境应使用只读副本、受控事务回滚或经过确认的安全样本。
- 计划优化后要用代表性参数和稳定数据集复测 P95/P99、锁等待、临时文件和资源消耗,不能只比较 cost 数字。
题目解析
执行计划是优化器对当前统计和参数的选择,不是 SQL 的永久性能证明。数据量、缓存状态、参数分布和并发都会让同一 SQL 走出不同表现。
最容易误判的是单个节点耗时:一个看起来很快的子节点如果被上层循环数万次,累计成本可能远高于一个一次性较慢的节点。
面试回答中应说明安全边界:先在代表性数据或只读副本执行,再将计划证据和业务指标对应起来,最后验证写入、锁和尾延迟是否真的改善。
常见误区
- 误区:对线上 UPDATE/DELETE 直接执行 EXPLAIN ANALYZE。改正:先确认副作用,使用只读副本、回滚事务或安全样本。
- 误区:只看 cost 越小越好。改正:cost 是估算值,要结合 actual rows、耗时、缓冲、I/O 和代表性参数。
- 误区:忽略 loops 只看节点 time。改正:重复执行的子节点必须把单次成本乘以实际循环规模理解。