【问题标题】:Should the column used to order results be included in the index of a postgresql table?用于排序结果的列是否应该包含在 postgresql 表的索引中?
【发布时间】:2021-04-29 19:06:15
【问题描述】:

我正在为 PostgreSQL 数据库创建索引。我想知道用于在 PostgreSQL 语句中对结果进行排序的列是否应包含在索引中。

假设我在 PostgreSQL 数据库中创建了一个标签为“table1”的表,其中列标签为“col1”、“col2”和“col3”。

我想执行以下查询:

SELECT * FROM table1 WHERE col1 = 'word1' AND col2 = 'word2' ORDER BY col3;

我知道这个搜索的索引应该包括WHERE 子句中引用的所有列,所以在这种情况下,索引应该包括 col1 和 col2。

索引也应该包含 col3 吗?

【问题讨论】:

  • 是的,但在索引键中的其他两列之后。想一想:您希望引擎在col1, col2 上进行点查找,然后按col3 对结果进行排序。如果您使用不等式 > <> <= 等,这将完全改变
  • 谢谢。那么这是否意味着我应该为 col3 创建一个单独的索引,或者只是它应该是同一索引的最终属性?
  • 后者。如果您的版本支持,则此顺序具有键列的一个索引col1, col2, col3 不要忘记include (other_columns)。并且不要使用select *,如果可以,请指定您需要的列。
  • 非常感谢!目前在开发中只使用 *,因为我稍后会添加列。

标签: sql database postgresql indexing sql-order-by


【解决方案1】:

因为您有相等比较,所以 Postgres 应该能够在 (col1, col2, col3) 上使用索引。

前两列用于where 子句;最后一个为order by

请注意,这非常适合您的查询。它假设字符串上的排序规则是兼容的并且没有类型转换。此外,where 中的比较需要是用于order by 的索引的相等比较。

我相信order by 的方向也必须与索引中定义的方向相匹配。

我发现多列索引上的MySQL documentation 是对该主题的一个很好的介绍。它侧重于where 子句,但它很好地说明了何时可以使用和不能使用索引——并且这些规则在数据库中往往是相似的。

【讨论】:

  • '我认为 order by 的方向也必须与索引中定义的方向相匹配。'。那只是按多列排序。对于按一列排序,它可以只向后扫描索引以获得另一个方向。
  • @jjanes 。 . .我知道它可以。但是你知道它在使用其他键进行过滤时是否会这样做吗?
  • 是的,它仍然可以根据前面的列跳转到一个点,然后向后扫描。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多