EXPLAIN ANALYZE 输出看起来令人生畏,直到您知道实际重要的三个数字。以下是我阅读它们的顺序,以及指向特定错误的模式。
实际重要的三个数字
1. 总执行时间 (Execution Time)
Total runtime: 1234.567 ms
这是最重要的指标。如果查询慢,这里会告诉您。
2. 实际行数 vs 估计行数 (Actual vs Estimated Rows)
Seq Scan on users (cost=0.00..123.45 rows=1000 width=32) (actual time=1.234..567.890 rows=50000 loops=1)
巨大差异表明规划器做出了错误假设。
3. 缓冲区命中率 (Buffer Hit Ratio)
Buffers: shared hit=1000 read=50
高命中率 = 好缓存使用,低命中率 = 磁盘 I/O 问题。
阅读顺序
- 从底部开始 - 总执行时间
- 向上工作 - 查找成本最高的节点
- 检查行数估计 - 实际 vs 估计
- 查看缓冲区统计 - I/O 模式
常见问题模式
顺序扫描当应该索引扫描时
Seq Scan on large_table (cost=1000.00..2000.00 rows=100000 width=32)
解决方案: 添加适当的索引
嵌套循环当应该哈希连接时
Nested Loop (cost=1000.00..100000.00 rows=1000 width=64)
-> Seq Scan on users
-> Index Scan on orders
解决方案: 增加 work_mem 或重写查询
缓冲区未命中太多
Buffers: shared hit=10 read=1000
解决方案: 增加 shared_buffers 或改善查询
排序溢出到磁盘
Sort Method: external merge Disk: 16384kB
解决方案: 增加 work_mem
实际应用
这些洞察帮助我识别并修复了:
- 缺失索引
- 低效的连接顺序
- 内存不足的问题
- 缓存未命中
记住:EXPLAIN ANALYZE 是您的查询性能调试器。学习阅读它将节省您无数小时的猜测。