[英]Multicolumn index for where and order by clause (postgres)
考慮這樣的查詢:
select ... from table where a = 1 and b > 2 order by c asc
這個查詢的理想索引是什么? 我應該使用一個索引(a,b,c)還是兩個單獨的(a,b)和(c)?
提前致謝。
你可能不能同時做好這兩件事。 相等不是問題,但你不能干凈地將不等與排序結合起來。 您希望返回多少行? 如果b>2
非常有選擇性,只剩下幾行要排序,那么顯然你想要(a,b)
因為獲得選擇性很有用,而對剩余的幾行進行排序不會花費很長時間。 另一方面,如果b>2
僅排除幾行,則(a,c)
(可能在末尾有更多列以允許僅索引掃描)在刪除失敗 b 的少數行時避免大的慢排序“艱難的道路”不需要很長時間。
您可以同時構建兩者並讓計划者進行調用,盡管這樣做遠非完美。
可以在所有三列上使用 GiST 索引來同時實現不等式過濾和排序,但 GiST 索引的開銷比 BTree 索引高得多,而且構建和維護速度較慢,因此不太可能值得一試,盡管如果您使用 LIMIT 可以使其更具吸引力。 您還需要以扭曲的方式編寫查詢,作為 KNN 查詢(由btree_gist擴展輔助):
where a = 1 and b > 2 order by c <-> impossibly_low_value
還有其他高級可能性。 如果您比較 b 的東西總是>2
,那么您可以使用部分索引(a,c) where b>2
或表達式索引(a,(b>2),c)
。 您也許還可以在 b 上進行有用的分區。 如果 b 有少量不同的值,您可以對每個合格的不同值的查詢結果進行 UNION 並使用(a,b,c)
上的索引,獲得有效的合並 append:
(select * from foo where a=1 and b=3 order by c asc)
union all
(select * from foo where a=1 and b=4 order by c asc)
order by c asc;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.