在PostgreSQL中,我想在三列A, B, C
上使用复合索引。B
是created_at
日期时间,有时我可能不使用B
进行查询。
如果我在(A, B, C)
上复合索引,然后使用A
和C
而不是B
的条件进行查询,会发生什么情况?(也就是说,使用A
和C
,但希望得到所有时间范围的数据,而不仅仅是某个特定时间范围的数据?)
Postgres是否足够聪明,仍然使用(A, B, C)
复合索引,而只是跳过B?
在PostgreSQL中,我想在三列A, B, C
上使用复合索引。B
是created_at
日期时间,有时我可能不使用B
进行查询。
如果我在(A, B, C)
上复合索引,然后使用A
和C
而不是B
的条件进行查询,会发生什么情况?(也就是说,使用A
和C
,但希望得到所有时间范围的数据,而不仅仅是某个特定时间范围的数据?)
Postgres是否足够聪明,仍然使用(A, B, C)
复合索引,而只是跳过B?
2条答案
按热度按时间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
开头并不重要:还有一些其他的考虑,但你的问题没有所有相关的细节。
sg2wtvxw2#
是的,它是。
我做了一个快速的检查,对一个查询做了一个解释,这个查询有一个索引的第一列和第三列的条件。它确实输出了它将对该索引做一个位图索引扫描,并在索引条件中提到了第一列和第三列。
(在9.3.5中测试)