快速表索引以进行范围查找

Ern*_*ill 3 sql postgresql indexing range-types

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

low BIGINT,
high BIGINT,
data1,
data2, 
...
Run Code Online (Sandbox Code Playgroud)

当查询该表,你有一个长整型,并希望找到对应的范围内的数据low,并high包括该值。索引此表以进行快速查找的最佳方法是什么?

Erw*_*ter 5

一个多列索引具有反向排序顺序:

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)

<@“元素包含在”运算符中