簡體   English   中英

PostgreSQL:哪個索引順序更好?

[英]PostgreSQL: Which is the better index order?

哪個索引對運行許多這些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) 

是否有只需要一個索引的更好的解決方案?

我不知道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將需要對數據進行排序。 我想不出一種簡便的方法來刪除外部類。

另一種選擇是使用GIN索引和兩列的數組:

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

我認為關於您的以下查詢

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM