3
我有一个大约有450万行的Postgres表。列基本上只是用于范围查找的快速表索引
low BIGINT,
high BIGINT,
data1,
data2,
...
当查询该表,你有一个长整型,并希望找到与包括该值low
和high
之间的范围内的数据。索引此表以进行快速查找的最佳方式是什么?
我有一个大约有450万行的Postgres表。列基本上只是用于范围查找的快速表索引
low BIGINT,
high BIGINT,
data1,
data2,
...
当查询该表,你有一个长整型,并希望找到与包括该值low
和high
之间的范围内的数据。索引此表以进行快速查找的最佳方式是什么?
一个multi-column index具有反向排序顺序:
CREATE INDEX tbl_low_high_idx on tbl(low, high DESC);
这样一来,该指数可以向前扫描到low
足够高,则采取所有行,直到high
太低 - 在一个扫描。这就是为什么sort order is implemented for indexes开头的主要原因:将不同顺序的多列索引中的不同排序顺序组合在一起。基本上,b-tree索引可以以几乎相同的速度在两个方向上遍历,所以对于单列索引几乎不需要ASC
/DESC
。
您还可能有兴趣在新的range types PostgreSQL的9.2。可以indexed with a GiST index这样的:
CREATE INDEX tbl_idx ON tbl USING gist (low_high);
应该使这种形式的查询执行速度非常快:
SELECT * FROM tbl WHERE my_value <@ low_high;
我试过了,查找速度非常快。谢谢! –
@ ErnestFriedman-Hill:很好!我添加了一些关于9.2的新功能,这可能会让你感到兴奋。 :) –