为每个 WHERE 列建立索引并非 PostgreSQL 的优化
发布: (2026年5月11日 GMT+8 23:20)
2 分钟阅读
原文: Dev.to
Source: Dev.to

我经常看到的一个 PostgreSQL 索引错误:
“查询在 A、B 和 C 上过滤,所以我们在 A、B、C 上创建索引。”
这可能有效,但也可能是错误的索引。
复合 B‑tree 索引的考虑因素
- 谓词类型(相等 vs. 范围)
- 列顺序
- 选择性
- 表大小
- 实际执行计划
谓词顺序
相等谓词通常应放在 范围谓词之前。如果先放置范围谓词,可能会导致规划器无法高效使用后面的列。
统计信息(n_distinct)
列统计中的 n_distinct 值会影响选择性估计。即使索引在理论上看起来不错,如果规划器的统计信息显示相反,它也可能毫无用处。
当好的索引被忽略时
即使是理论上最优的索引,如果规划器在给定的查询计划中从未认为它有益,也会被忽略。
使用 pgAssistant 的自动化推荐
pgAssistant 通过以下步骤自动化索引推荐工作流:
- 对查询运行
EXPLAIN ANALYZE。 - 检查规划器统计信息。
- 根据观察到的执行计划建议最合适的索引。
完整写作
https://beh74.github.io/pgassistant-blog/post/query_advisor/