一尘不染

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

sql

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

low BIGINT,
high BIGINT,
data1,
data2, 
...

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


阅读 160

收藏
2021-03-08

共1个答案

一尘不染

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

CREATE INDEX tbl_low_high_idx on tbl(low, high DESC);

这样,可以将索引向前扫描到low足够高的位置,然后对所有行进行扫描直到high太低为止-
一次扫描。这就是为什么要对索引执行排序顺序的主要原因:将不同的排序顺序组合在具有不同顺序的多列索引中。基本上,b树索引可以以几乎相同的速度在两个方向上遍历,因此单列索引几乎不需要ASC/
DESC


您可能也对 PostgreSQL 9.2* 的新
范围类型

感兴趣。可以使用
GiST索引

进行索引,如下所示:
*
****

CREATE INDEX tbl_idx ON tbl USING gist (low_high);

应该使这种形式的查询执行得非常快:

SELECT * FROM tbl WHERE my_value <@ low_high;

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

2021-03-08