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

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 上使用复合索引。 Bcreated_at 日期时间,有时我可能会在没有B 的情况下进行查询。

如果我在(A, B, C) 上复合索引,然后在AC 上查询条件,而不是B,会发生什么情况? (也就是说,AC 但想要一直使用它,而不仅仅是某个特定的时间范围?)

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,都重要:

Multicolumn index and performance

还有其他一些注意事项,但您的问题并未包含所有相关细节。

Is a composite index also good for queries on the first field?

【讨论】:

【参考方案2】:

是的。

我通过对具有索引第一列和第三列条件的查询进行 EXPLAIN 进行了快速检查。它确实输出了它将对该索引执行位图索引扫描,并在索引条件中提到了第一列和第三列。

(在 9.3.5 上测试)

【讨论】:

你能发布一下解释计划吗?

以上是关于具有三个键的复合索引,如果我查询跳过中间一个会发​​生啥?的主要内容,如果未能解决你的问题,请参考以下文章

如果我在一个字段上同时具有简单索引和复合索引,那么在包含该字段的查询中使用哪一个?

MySQL索引失效原因

阿帕奇卡桑德拉。索引或具有复合主键的表的特定情况

使用Spring-data-cassandra查询具有复合主键的表

有没有办法组合 mysqli 查询或给它们一个优化序列?

使用 Spring-data-cassandra 查询具有复合主键的表