4

在多列索引中,我知道顺序对于哪些类型的查询能够使用索引很重要。中提到的列WHERE应该是索引中最左边的列。这是一篇关于此的 Postgres 文章。

但是,考虑使用所有列的情况。在这两种情况下,顺序是否会影响使用索引的性能:

  1. 具有多个=. 例子:SELECT * FROM "posts" WHERE "user_id" = 5 AND "post_type" = 'Thing' AND "state" = 'active'
  2. 在涉及IN. 例子:SELECT * FROM "posts" WHERE "user_id" = 5 AND "post_type" = 'Thing' AND ("state" IN ('active', 'draft'))
4

3 回答 3

4

多列索引可以想象成树:

桌子
 column1_idx_value0
   column2_idx_value0
   column2_idx_value1
    column3_idx_value0
    column3_idx_value1
    column3_idx_value2
 column1_idx_value1
   column2_idx_value0
   column2_idx_value1
    column3_idx_value0
    column3_idx_value1
    column3_idx_value2

因此,如果您的查询与使用column1- 索引进行比较,则使用列1 AND 21 and 2 and 3- 索引

但是如果 with column 2only or with 1 and 3or 2 and 3- 不使用索引(至少在一般情况下,DBMS 可以进行优化)

所以,第一个问题 - 如果使用所有列 - 将使用索引

它们对于column IN (value)语句相同,如果比较的列在索引中并且使用了该索引 - 如果是查询(不是 const 作为你的),它会更快value- 它们适用相同的规则

更新:SQL 查询中的列顺序不影响性能,至少在所有现代 DBMS 中,索引创建语句中的顺序 - 影响

于 2013-10-14T19:16:45.633 回答
1

是的,多列索引中的列顺序确实很重要。我猜,首先放置具有最高基数的列,即示例中的 user_id,post typestate假设很少的值。如果是这样,它们几乎没有用作索引,如果单独使用或首先在多列索引中使用,因为直接扫描表然后先扫描索引然后扫描表更便宜。如果用作多列索引中的第二个和第三个索引,那么是的,它们可能很有用。

现在请注意,索引维护不是免费的。它的成本与表的更新率和大小成正比。如果您的更新时间开始增加太多,那么如果该查询不是很常见,则特别删除索引中的一两个额外列。

于 2013-10-14T22:39:18.460 回答
0

在条件IN=条件下,顺序无关紧要(只要IN列表不太大)。

要检查它 - 只需使用 . 检查查询计划EXPLAIN ANALYZE

于 2013-10-14T19:12:51.920 回答