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

Som*_*Guy 3 postgresql indexing compound-index postgresql-performance

对于PostgreSQL,我想在三列上使用复合索引A, B, CBcreated_at日期时间,有时我可能不带进行查询B

如果我在上复合索引,(A, B, C)然后在A和上查询条件C,但没有,该B怎么办?(也就是说,AC但希望它在所有的时候,不只是一些特定的时间范围?)

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

Erw*_*ter 5

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

如果第一列具有很高的选择性(每个列仅几行A),那么您几乎不会注意到性能上的差异,因为任何一种访问方法(甚至是对精简集的顺序扫描)都很便宜。性能影响随着每行的行数而增加A

对于您描述的情况,我建议在(A, C, B)(C, A, B)(仅确保B最后出现)上创建索引以优化性能。这样,你得到的查询最佳性能(A, B, C)(A, C)一致好评。

与索引中的列顺序不同,查询中的谓词顺序并不重要。

我们已经在dba.SE上对此进行了详细讨论:

请注意,无论是牵头还是手头的案件,都没关系:A, CC, A

还有其他一些注意事项,但您的问题并不包含所有相关细节。