在多列索引中,我知道顺序对哪些类型的查询能够使用索引很重要。 WHERE
中提到的列应该是索引中最左侧的列。 Here's a Postgres article about that.
但是,请考虑使用所有列的情况。在这两种情况下,订单是否会影响使用索引的性能:
=
进行查询。例如:SELECT * FROM "posts" WHERE "user_id" = 5 AND "post_type" = 'Thing' AND "state" = 'active'
IN
的查询中的SELECT * FROM "posts" WHERE "user_id" = 5 AND "post_type" = 'Thing' AND ("state" IN ('active', 'draft'))
答案 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 2
或1 and 2 and 3
- 使用了索引
但如果仅使用column 2
或使用1 and 3
或2 and 3
- 不使用索引(至少在一般情况下,DBMS可以进行优化)
所以,第一个问题 - 如果使用了所有列 - 将使用索引
它们对于column IN (value)
语句是相同的,如果比较的列在索引中并且使用了这个索引 - 如果value
是查询(不是const作为你的那个),它会更快 - 它们相同规则适用
更新:SQL查询中的列顺序不会影响性能,至少在所有现代DBMS中,索引创建语句中的顺序 - 影响
答案 1 :(得分:0)
如果IN
和=
条件无关紧要(只要IN
列表不太大)。
要检查它 - 只需使用EXPLAIN ANALYZE
检查查询计划。
答案 2 :(得分:0)
是的,多列索引中列的顺序很重要。首先放置具有最高cardinality的列,示例中的user_id,我猜,post type
和state
假设的值非常少。如果是这样,它们几乎没有用作索引,如果单独使用或首先在多列索引中使用,因为直接扫描表然后首先扫描索引然后再扫描表是更便宜的。如果在多列索引中用作第二个和第三个索引,那么它们可能是有用的。
现在请注意,索引维护不是免费的。其成本与表的更新率和大小成正比。如果您的更新时间开始增加太多,那么如果该查询不常见,请特别减少索引中的一个或两个额外列。