[英]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.