为每个 WHERE 列建立索引并非 PostgreSQL 的优化

发布: (2026年5月11日 GMT+8 23:20)
2 分钟阅读
原文: Dev.to

Source: Dev.to

Cover image for Indexing every WHERE column is not PostgreSQL optimization

我经常看到的一个 PostgreSQL 索引错误:

“查询在 A、B 和 C 上过滤,所以我们在 A、B、C 上创建索引。”
这可能有效,但也可能是错误的索引。

复合 B‑tree 索引的考虑因素

  • 谓词类型(相等 vs. 范围)
  • 列顺序
  • 选择性
  • 表大小
  • 实际执行计划

谓词顺序

相等谓词通常应放在 范围谓词之前。如果先放置范围谓词,可能会导致规划器无法高效使用后面的列。

统计信息(n_distinct

列统计中的 n_distinct 值会影响选择性估计。即使索引在理论上看起来不错,如果规划器的统计信息显示相反,它也可能毫无用处。

当好的索引被忽略时

即使是理论上最优的索引,如果规划器在给定的查询计划中从未认为它有益,也会被忽略。

使用 pgAssistant 的自动化推荐

pgAssistant 通过以下步骤自动化索引推荐工作流:

  1. 对查询运行 EXPLAIN ANALYZE
  2. 检查规划器统计信息。
  3. 根据观察到的执行计划建议最合适的索引。

完整写作

https://beh74.github.io/pgassistant-blog/post/query_advisor/

0 浏览
Back to Blog

相关文章

阅读更多 »