具有三个键的复合索引,如果我查询跳过中间的键会怎样?
Compound index with three keys, what happens if I query skipping the middle one?
对于 PostgreSQL,我想在三列上使用复合索引 A, B, C
。 B
是 created_at
日期时间,偶尔我可能会在没有 B
的情况下查询。
如果我在 (A, B, C)
上复合索引,然后在 A
和 C
而非 B
上查询条件,会发生什么情况? (也就是说,A
和 C
但想要它一直存在,而不仅仅是某个特定的时间范围?)
Postgres 是否足够聪明,仍然使用 (A, B, C)
复合索引但只是跳过 B?
是的。
我通过对具有索引第一列和第三列条件的查询进行 EXPLAIN 进行了快速检查。它确实输出了它将对该索引执行位图索引扫描,并在索引条件中提到了第一列和第三列。
(9.3.5 测试)
Postgres 可以在 b 树索引中使用非前导列,但效率要低得多。
如果第一列非常有选择性(每个 A
只有几行),那么您几乎不会注意到性能上的差异,因为这两种访问方法(甚至是对缩减集的顺序扫描)都很便宜。性能影响随着每个 A
.
行数的增加而增加
对于您描述的情况,我建议在 (A, C, B)
或 (C, A, B)
上创建索引(只需确保 B
排在最后) 来优化性能。通过这种方式,您可以在 (A, B, C)
和 (A, C)
上获得最佳查询性能。
与索引中列的顺序不同,查询中谓词的顺序无关紧要。
我们已经在 dba.SE 上详细讨论了这个问题:
请注意,与无关手:
还有一些其他的注意事项,但你的问题没有提供所有相关细节。
对于 PostgreSQL,我想在三列上使用复合索引 A, B, C
。 B
是 created_at
日期时间,偶尔我可能会在没有 B
的情况下查询。
如果我在 (A, B, C)
上复合索引,然后在 A
和 C
而非 B
上查询条件,会发生什么情况? (也就是说,A
和 C
但想要它一直存在,而不仅仅是某个特定的时间范围?)
Postgres 是否足够聪明,仍然使用 (A, B, C)
复合索引但只是跳过 B?
是的。
我通过对具有索引第一列和第三列条件的查询进行 EXPLAIN 进行了快速检查。它确实输出了它将对该索引执行位图索引扫描,并在索引条件中提到了第一列和第三列。
(9.3.5 测试)
Postgres 可以在 b 树索引中使用非前导列,但效率要低得多。
如果第一列非常有选择性(每个 A
只有几行),那么您几乎不会注意到性能上的差异,因为这两种访问方法(甚至是对缩减集的顺序扫描)都很便宜。性能影响随着每个 A
.
对于您描述的情况,我建议在 (A, C, B)
或 (C, A, B)
上创建索引(只需确保 B
排在最后) 来优化性能。通过这种方式,您可以在 (A, B, C)
和 (A, C)
上获得最佳查询性能。
与索引中列的顺序不同,查询中谓词的顺序无关紧要。
我们已经在 dba.SE 上详细讨论了这个问题:
请注意,与无关手:
还有一些其他的注意事项,但你的问题没有提供所有相关细节。