3

我有一个大约 450 万行的 Postgres 表。列基本上只是

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

当您查询此表时,您有一个长整数,并希望找到与low包含high该值的范围相对应的数据。索引此表以进行快速查找的最佳方法是什么?

4

1 回答 1

5

具有相反排序顺序的多列索引:

CREATE INDEX tbl_low_high_idx on tbl(low, high DESC);

这样,索引可以向前扫描到low足够高的位置,然后取出所有行直到high太低 - 一次扫描。这就是为索引实现排序顺序的主要原因:在具有不同顺序的多列索引中组合不同的排序顺序。基本上,b-tree 索引可以以几乎相同的速度在两个方向上遍历,因此单列索引几乎不需要ASC/ 。DESC


您可能还对PostgreSQL 9.2的新范围类型感兴趣。可以使用这样的GiST 索引进行索引:

CREATE INDEX tbl_idx ON tbl USING gist (low_high);

应该使这种形式的查询执行得非常快:

SELECT * FROM tbl WHERE my_value <@ low_high;

<@“元素包含在”运算符中。

于 2012-08-30T03:09:01.163 回答