PostgreSQL 查询优化实战
从 EXPLAIN ANALYZE 到索引设计,记录一次真实的优化过程。
线上有一个接口响应时间从 200ms 逐渐增长到了 3 秒,最终定位到一条复杂查询。
问题定位
通过 EXPLAIN (ANALYZE, BUFFERS) 发现:
- 全表扫描了一张 500 万行的表
- Nested Loop Join 产生了大量重复计算
优化过程
- 添加复合索引,覆盖 WHERE 和 ORDER BY 字段
- 将子查询改写为 JOIN
- 对大表启用分区(按月分区)
结果
响应时间从 3 秒降至 80ms。关键收获:先看执行计划,再决定优化方向。