使用 PostgreSQL,我想在三列上使用复合索引A, B, C
。B
是created_at
日期时间,有时我可能会在没有B
.
如果我复合索引 on(A, B, C)
但随后使用A
and条件进行查询C
,但不是,会发生什么情况B
?(也就是说,A
但C
想要它一直持续,而不仅仅是某个特定的时间范围?)
Postgres 是否足够聪明,仍然可以使用(A, B, C)
复合索引但只是跳过 B?
使用 PostgreSQL,我想在三列上使用复合索引A, B, C
。B
是created_at
日期时间,有时我可能会在没有B
.
如果我复合索引 on(A, B, C)
但随后使用A
and条件进行查询C
,但不是,会发生什么情况B
?(也就是说,A
但C
想要它一直持续,而不仅仅是某个特定的时间范围?)
Postgres 是否足够聪明,仍然可以使用(A, B, C)
复合索引但只是跳过 B?
Postgres 可以在 b 树索引中使用非前导列,但效率要低得多。
如果第一列非常有选择性(每列只有几行A
),那么您几乎不会注意到性能差异,因为任何一种访问方法(甚至是对缩减集的顺序扫描)都很便宜。性能影响随着每个A
.
对于您描述的情况,我建议在(A, C, B)
or上创建索引(C, A, B)
(只要确保B
最后出现)以优化性能。这样,您就可以(A, B, C)
在(A, C)
类似的查询中获得最佳性能。
与索引中的列顺序不同,查询中谓词的顺序无关紧要。
我们已经在 dba.SE 上详细讨论过这个问题:
请注意,您是否领导手头的案件并不重要:A, C
C, A
还有一些其他的考虑,但你的问题没有所有相关的细节。
是的。
我通过对具有索引第一列和第三列条件的查询进行 EXPLAIN 进行快速检查。它确实输出了它将对该索引执行位图索引扫描,并在索引条件中提到了第一列和第三列。
(在 9.3.5 上测试)