具有三个键的复合索引,如果我查询跳过中间一个会发生啥?
Posted
技术标签:
【中文标题】具有三个键的复合索引,如果我查询跳过中间一个会发生啥?【英文标题】:Compound index with three keys, what happens if I query skipping the middle one?具有三个键的复合索引,如果我查询跳过中间一个会发生什么? 【发布时间】:2015-05-26 20:14:21 【问题描述】:对于 PostgreSQL,我想在三列 A, B, C
上使用复合索引。 B
是created_at
日期时间,有时我可能会在没有B
的情况下进行查询。
如果我在(A, B, C)
上复合索引,然后在A
和C
上查询条件,而不是B
,会发生什么情况? (也就是说,A
和 C
但想要一直使用它,而不仅仅是某个特定的时间范围?)
Postgres 是否足够聪明,仍然可以使用 (A, B, C)
复合索引但只是跳过 B?
【问题讨论】:
【参考方案1】:Postgres 可以在 b 树索引中使用非前导列,但效率要低得多。
如果第一列非常有选择性(每个 A
只有几行),那么您几乎不会注意到性能差异,因为任何一种访问方法(即使是对缩减集的顺序扫描)都很便宜。性能影响随着每个 A
的行数而增加。
对于您描述的情况,我建议在 (A, C, B)
或 (C, A, B)
上创建索引(只需确保 B
在最后)以优化性能。这样,您就可以在 (A, B, C)
和 (A, C)
上获得最佳性能。
与索引中的列顺序不同,查询中谓词的顺序无关紧要。
我们已经在 dba.SE 上详细讨论过这个问题:
Working of indexes in PostgreSQL请注意,对于手头的案子,无论您是使用A, C
还是C, A
,都重要:
还有其他一些注意事项,但您的问题并未包含所有相关细节。
Is a composite index also good for queries on the first field?【讨论】:
【参考方案2】:是的。
我通过对具有索引第一列和第三列条件的查询进行 EXPLAIN 进行了快速检查。它确实输出了它将对该索引执行位图索引扫描,并在索引条件中提到了第一列和第三列。
(在 9.3.5 上测试)
【讨论】:
你能发布一下解释计划吗?以上是关于具有三个键的复合索引,如果我查询跳过中间一个会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章
如果我在一个字段上同时具有简单索引和复合索引,那么在包含该字段的查询中使用哪一个?