2011-03-30 105 views
0

我将如何在PostgresSQL 8.3中创建索引,这会使排序后的边界框查询高效?我查询的表格有很多行。高效的排序边界框查询

这就是我想要的创建索引,使下面的查询尽可能高效:

SELECT * FROM features 
WHERE lat BETWEEN ? AND ? 
AND lng BETWEEN ? AND ? 
ORDER BY score DESC 

的功能表如下所示:

Column |   Type   | 
------------+------------------------+ 
id   | integer    | 
name  | character varying(255) | 
type  | character varying(255) | 
lat  | double precision  | 
lng  | double precision  | 
score  | double precision  | 
html  | text     | 

回答

0

你可以尝试使用GiST index实现一棵R-Tree。这种类型的索引记录很差,因此您可能需要通过源代码分发中的示例代码进行浏览。

(注:我使用R-tree索引之前的建议似乎是过时的,它们是不建议使用)

0

听起来像是你会想看看PostGIS,一个PostgreSQL的空间模块数据类型和查询。它支持使用GiST索引进行快速查找。不幸的是我不能进一步指导你,因为我自己没有使用过PostGIS。

+0

PostGIS是默认PostgreSQL安装的一部分,还是需要单独设置它?特别是,像Heroku那样预装了它? – 2011-03-31 00:06:45

+0

显然它在专用的Heroku实例上可用,但它们非常昂贵。我并不需要任何花哨的东西,所以如果PostgreSQL可以在不使用PostGIS的情况下做到这一点,那将会很好。 – 2011-03-31 00:16:53

+0

如果你可以在你的机器上编译代码(或者使用提供的dist包 - 这很容易),你可以自己设置PostGIS – DrColossos 2011-03-31 09:34:17

1

要创建的点属性要旨索引,使我们可以高效地对转换函数的结果用方块运算符:

CREATE INDEX pointloc 
    ON points USING gist (box(location,location)); 
SELECT * FROM points 
    WHERE box(location,location) && '(0,0),(1,1)'::box; 

http://www.postgresql.org/docs/9.0/static/sql-createindex.html

这是在本例中9.0文档。它应该适用于8.3,因为这些功能已经存在很久了。

+0

我也可以通过评分栏来得到结果吗?具体来说,某些查询将返回数万行大的结果。我只想使用按分数排序的前100名(比如说)。 – 2011-03-31 02:25:30

+0

如果你按'score desc limit 100'命令,那么postgres将使用前N个heapsort来维护内存中的前100个结果(假设你的work_mem足够大),而不是做一个完整的排序并且只读取前100个。 – araqnid 2011-03-31 10:19:10