我有一个大约 450 万行的 Postgres 表。列基本上只是
low BIGINT,
high BIGINT,
data1,
data2,
...
当您查询此表时,您有一个长整数,并希望找到与low
包含high
该值的范围相对应的数据。索引此表以进行快速查找的最佳方法是什么?
我有一个大约 450 万行的 Postgres 表。列基本上只是
low BIGINT,
high BIGINT,
data1,
data2,
...
当您查询此表时,您有一个长整数,并希望找到与low
包含high
该值的范围相对应的数据。索引此表以进行快速查找的最佳方法是什么?
具有相反排序顺序的多列索引:
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;
<@
是“元素包含在”运算符中。