2012-08-30 56 views
3

我有一個大約有450萬行的Postgres表。列基本上只是用於範圍查找的快速表索引

low BIGINT, 
high BIGINT, 
data1, 
data2, 
... 

當查詢該表,你有一個長整型,並希望找到與包括該值lowhigh之間的範圍內的數據。索引此表以進行快速查找的最佳方式是什麼?

回答

4

一個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; 

<@作爲"element is contained by" operator

+0

我試過了,查找速度非常快。謝謝! –

+0

@ ErnestFriedman-Hill:很好!我添加了一些關於9.2的新功能,這可能會讓你感到興奮。 :) –