对于 PostgreSQL,我想在三列上使用复合索引A, B, C
. B
is the created_at
日期时间,有时我可能会查询没有B
.
如果我复合索引会发生什么(A, B, C)
但然后查询条件A
and C
, 但不是B
? (那是,A
and C
但想要所有时间,而不仅仅是某个特定时间范围?)
Postgres 是否足够聪明,仍然可以使用(A, B, C)
复合索引但跳过B?
Postgres 可以在 a 中使用非前导列多列 B 树索引 https://www.postgresql.org/docs/current/indexes-multicolumn.html,但效率要低得多。
如果第一列是非常有选择性的(每列只有几行)A
)那么您几乎不会注意到性能差异,因为这两种访问方法都很便宜。性能影响随着每个行数的增加而增加A
.
对于您描述的情况,我建议创建索引(A, C, B)
or (C, A, B)
。只要确保B
最后。或者掉落B
完全来自索引。或者为用例创建另一个索引B
。这样您就可以获得最佳的查询性能(A, B, C)
and on (A, C)
alike.
与索引中列的顺序不同,查询中谓词的顺序并不重要。
我们已经在 dba.SE 上详细讨论了这一点:
- PostgreSQL 中索引的工作 https://dba.stackexchange.com/q/6115/3684
请注意,它确实not不管你是否领导A, C
or C, A
对于手头的情况:
- 多列索引和性能 https://dba.stackexchange.com/a/33220/3684
还有一些其他考虑因素,但您的问题没有所有相关细节。
- 复合索引也适合第一个字段的查询吗? https://dba.stackexchange.com/a/27493/3684
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)