多列索引顺序和IN查询

时间:2013-10-14 18:59:15

标签: postgresql

在多列索引中,我知道顺序对哪些类型的查询能够使用索引很重要。 WHERE中提到的列应该是索引中最左侧的列。 Here's a Postgres article about that.

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

  1. 使用多个=进行查询。例如:SELECT * FROM "posts" WHERE "user_id" = 5 AND "post_type" = 'Thing' AND "state" = 'active'
  2. 涉及IN的查询中的
  3. 。例如:SELECT * FROM "posts" WHERE "user_id" = 5 AND "post_type" = 'Thing' AND ("state" IN ('active', 'draft'))

3 个答案:

答案 0 :(得分:4)

多列索引可以想象为树:

table
 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 - 使用了索引

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

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

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

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

答案 1 :(得分:0)

如果IN=条件无关紧要(只要IN列表不太大)。

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

答案 2 :(得分:0)

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

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