用于范围查找的快速表索引

时间:2012-08-30 03:04:26

标签: sql postgresql indexing range-types

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

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

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

1 个答案:

答案 0 :(得分:4)

具有反向排序顺序的multi-column index

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

这样,可以将索引向前扫描到low足够高的位置,然后将所有行扫描到high太低 - 所有这些都在一次扫描中。这就是sort order is implemented for indexes开始的主要原因:在具有不同顺序的多列索引中组合不同的排序顺序。基本上,b树索引可以以几乎相同的速度在两个方向上遍历,因此单列索引几乎不需要ASC / DESC


您可能也对 PostgreSQL 9.2 的新range types感兴趣。可以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