具有三个键的复合索引,如果我查询跳过中间的键会怎样?

Compound index with three keys, what happens if I query skipping the middle one?

对于 PostgreSQL,我想在三列上使用复合索引 A, B, CBcreated_at 日期时间,偶尔我可能会在没有 B 的情况下查询。

如果我在 (A, B, C) 上复合索引,然后在 AC 而非 B 上查询条件,会发生什么情况? (也就是说,AC 但想要它一直存在,而不仅仅是某个特定的时间范围?)

Postgres 是否足够聪明,仍然使用 (A, B, C) 复合索引但只是跳过 B?

是的。

我通过对具有索引第一列和第三列条件的查询进行 EXPLAIN 进行了快速检查。它确实输出了它将对该索引执行位图索引扫描,并在索引条件中提到了第一列和第三列。

(9.3.5 测试)

Postgres 可以在 b 树索引中使用非前导列,但效率要低得多。

如果第一列非常有选择性(每个 A 只有几行),那么您几乎不会注意到性能上的差异,因为这两种访问方法(甚至是对缩减集的顺序扫描)都很便宜。性能影响随着每个 A.

行数的增加而增加

对于您描述的情况,我建议在 (A, C, B)(C, A, B) 上创建索引(只需确保 B 排在最后) 来优化性能。通过这种方式,您可以在 (A, B, C)(A, C) 上获得最佳查询性能。

与索引中列的顺序不同,查询中谓词的顺序无关紧要。

我们已经在 dba.SE 上详细讨论了这个问题:

请注意,无关手:

还有一些其他的注意事项,但你的问题没有提供所有相关细节。