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

rbl8hiat  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(87)

在PostgreSQL中,我想在三列A, B, C上使用复合索引。Bcreated_at日期时间,有时我可能不使用B进行查询。
如果我在(A, B, C)上复合索引,然后使用AC而不是B的条件进行查询,会发生什么情况?(也就是说,使用AC,但希望得到所有时间范围的数据,而不仅仅是某个特定时间范围的数据?)
Postgres是否足够聪明,仍然使用(A, B, C)复合索引,而只是跳过B?

7nbnzgx9

7nbnzgx91#

Postgres可以在multicolumn B-tree index中使用非前导列,但效率要低得多。
如果第一列的选择性很强(每个A只有几行),那么您几乎不会注意到性能上的差异,因为这两种访问方法的成本都很低。性能影响随着每个A的行数而增加。
对于您描述的情况,我建议在**(A, C, B)**或(C, A, B)上创建索引。只需确保B位于最后。或者从索引中完全删除B。或者为B的用例创建另一个索引。这样,您可以在(A, B, C)(A, C)上获得最佳的查询性能。
与索引中列的顺序不同,查询中 predicate 的顺序并不重要。
我们已经在dba上对此进行了详细讨论。SE:

请注意,***对于当前的情况,***您是以A, C还是C, A开头并不重要:

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

sg2wtvxw

sg2wtvxw2#

是的,它是。
我做了一个快速的检查,对一个查询做了一个解释,这个查询有一个索引的第一列和第三列的条件。它确实输出了它将对该索引做一个位图索引扫描,并在索引条件中提到了第一列和第三列。
(在9.3.5中测试)

相关问题