我有一个大约有450万行的Postgres表。列基本上只是
low BIGINT, high BIGINT, data1, data2, ...
当查询该表,你有一个长整型,并希望找到对应的范围内的数据low,并high包括该值。索引此表以进行快速查找的最佳方法是什么?
low
high
一个 多列索引 具有反向排序顺序:
CREATE INDEX tbl_low_high_idx on tbl(low, high DESC);
这样,可以将索引向前扫描到low足够高的位置,然后对所有行进行扫描直到high太低为止- 一次扫描。这就是为什么要对索引执行排序顺序的主要原因:将不同的排序顺序组合在具有不同顺序的多列索引中。基本上,b树索引可以以几乎相同的速度在两个方向上遍历,因此单列索引几乎不需要ASC/ DESC。
ASC
DESC
您可能也对 PostgreSQL 9.2* 的新 范围类型 感兴趣。可以使用 GiST索引 进行索引,如下所示: * ****
CREATE INDEX tbl_idx ON tbl USING gist (low_high);
应该使这种形式的查询执行得非常快:
SELECT * FROM tbl WHERE my_value <@ low_high;
<@是“元素包含在”运算符中。
<@