具有三个键的复合索引,如果我查询跳过中间一个会发​​生什么?

2024-03-19

对于 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(使用前将#替换为@)

具有三个键的复合索引,如果我查询跳过中间一个会发​​生什么? 的相关文章

随机推荐