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