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 问题。

阅读顺序

  1. 从底部开始 - 总执行时间
  2. 向上工作 - 查找成本最高的节点
  3. 检查行数估计 - 实际 vs 估计
  4. 查看缓冲区统计 - 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 是您的查询性能调试器。学习阅读它将节省您无数小时的猜测。