3
我有一個大約有450萬行的Postgres表。列基本上只是用於範圍查找的快速表索引
low BIGINT,
high BIGINT,
data1,
data2,
...
當查詢該表,你有一個長整型,並希望找到與包括該值low
和high
之間的範圍內的數據。索引此表以進行快速查找的最佳方式是什麼?
我有一個大約有450萬行的Postgres表。列基本上只是用於範圍查找的快速表索引
low BIGINT,
high BIGINT,
data1,
data2,
...
當查詢該表,你有一個長整型,並希望找到與包括該值low
和high
之間的範圍內的數據。索引此表以進行快速查找的最佳方式是什麼?
一個multi-column index具有反向排序順序:
CREATE INDEX tbl_low_high_idx on tbl(low, high DESC);
這樣一來,該指數可以向前掃描到low
足夠高,則採取所有行,直到high
太低 - 在一個掃描。這就是爲什麼sort order is implemented for indexes開頭的主要原因:將不同順序的多列索引中的不同排序順序組合在一起。基本上,b-tree索引可以以幾乎相同的速度在兩個方向上遍歷,所以對於單列索引幾乎不需要ASC
/DESC
。
您還可能有興趣在新的range types PostgreSQL的9.2。可以indexed with a GiST index這樣的:
CREATE INDEX tbl_idx ON tbl USING gist (low_high);
應該使這種形式的查詢執行速度非常快:
SELECT * FROM tbl WHERE my_value <@ low_high;
我試過了,查找速度非常快。謝謝! –
@ ErnestFriedman-Hill:很好!我添加了一些關於9.2的新功能,這可能會讓你感到興奮。 :) –