使用复合索引时,SELECT 查询中的字段顺序是否重要?

Sea*_*ean 8 postgresql index optimization select

我知道索引本身的列顺序非常重要;但是,使用该索引的后续 SELECT 查询中的列顺序如何?

例如,如果我在 上有一个多列索引[:col_1, :col_2, :col_3],我的 SELECT 语句是否需要看起来像"SELECT * FROM my_table WHERE col_1 = (?), col_2 = (?), col_3 = (?)"以便优化查询?或者我可以按任何顺序指定参数并且查询优化器会处理它?

我已经阅读了一些 类似的答案,但似乎没有一个明确的答案指向文档,并相对于索引进行了回答。一些答案说“没关系”或“效果可以忽略不计”。

我正在 PostgreSQL 上使用 RoR/ActiveRecord,但问题确实适用于任何 SQL/关系数据库。

Jac*_*las 11

不,您可以where按任何顺序指定“参数”(子句的部分),查询优化器将处理它。优化器将按照它估计的最有效的顺序进行过滤,但请注意,这比仅选择要过滤的顺序更复杂:例如,过滤可能在加入之前或之后完成。

您无法完全证明这一点,但您可以通过试验并查看计划是否更改来证明对于特定查询是正确的。甚至可能确实存在顺序确实很重要的边缘情况,但我的建议是忽略这种可能性并假设它永远不会发生,否则您将花费​​大量精力尝试不同的排列。最好专注于您知道可以带来好处的调整类型(例如正确的索引)。