5

使用 PostgreSQL,我想在三列上使用复合索引A, B, CBcreated_at日期时间,有时我可能会在没有B.

如果我复合索引 on(A, B, C)但随后使用Aand条件进行查询C,但不是,会发生什么情况B?(也就是说,AC想要它一直持续,而不仅仅是某个特定的时间范围?)

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

4

2 回答 2

7

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

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

对于您描述的情况,我建议在(A, C, B)or上创建索引(C, A, B)(只要确保B最后出现)以优化性能。这样,您就可以(A, B, C)(A, C)类似的查询中获得最佳性能。

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

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

请注意,您是否领导手头的案件并不重要:A, CC, A

还有一些其他的考虑,但你的问题没有所有相关的细节。

于 2015-03-23T18:50:28.940 回答
1

是的。

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

(在 9.3.5 上测试)

于 2015-03-23T18:06:15.750 回答