PostgreSQL:哪个索引顺序更好?

时间:2019-03-11 17:35:27

标签: sql postgresql

什么索引对运行许多这些PostgreSQL查询最有帮助?

SELECT id, pair_time, user1, user2 
FROM pairs 
WHERE ? in (user1, user2) 
ORDER by pair_time

? =运行时指定的任意用户名。

我在想这两个索引:

CREATE INDEX ON pairs (user1, pair_time)
CREATE INDEX ON pairs (user2, pair_time)

但是顺序应该颠倒吗?

CREATE INDEX ON pairs (pair_time, user1) 
CREATE INDEX ON pairs (pair_time, user2) 

有没有更好的解决方案,只需要一个索引?

3 个答案:

答案 0 :(得分:1)

我不知道Postgres是否会在此查询中明智地使用这些索引中的任何一个。

您可以尝试以下方法:

SELECT u.*
FROM ((SELECT id, pair_time, user1, user2
       FROM pairs
       WHERE user1 = ?
      ) UNION ALL
      (SELECT id, pair_time, user1, user2
       FROM pairs
       WHERE user2 = ?
      )
     ) u
ORDER by pair_time;

这将对每个子查询使用pairs(user1)pairs(user2)上的索引。外部order by将需要对数据进行排序。我想不出一种简便的方法来删除外部排序。

答案 1 :(得分:1)

另一种选择是使用GIN index和两列组成的数组:

create index on pairs using gin ((array[user1, user2]) array_ops);

然后将您的查询更改为使用比较数组:

select id, pair_time, user1, user2 
from pairs
where array[user1, user2] && array[1234]
order by pair_time

答案 2 :(得分:0)

我认为关于您的以下查询

SELECT id, pair_time, user1, user2 FROM pairs WHERE ? in (user1, user2) ORDER by pair_time

以下索引将比您创建的其他2索引更好。

CREATE INDEX ON user_pairs (user1, pair_time)
CREATE INDEX ON user_pairs (user2, pair_time)