2012-08-30 26 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的新功能,这可能会让你感到兴奋。 :) –