我有一个大约450万行的Postgres表。这些列基本上只是
low BIGINT,
high BIGINT,
data1,
data2,
...
查询此表时,您有一个长整数,并希望查找与包含该值的low
和high
之间的范围对应的数据。索引此表进行快速查找的最佳方法是什么?
答案 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;