微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

database – 空间索引与两个坐标索引

我有一个有两列的表:纬度和经度.我希望将所有对象都放在“矩形”(井,纬度/纬度坐标公制中的矩形)边界框内:最小 – 最大纬度和最小 – 最大经度.基本上归结为以下伪sql

SELECT * FROM MyTable WHERE lat < :maxlat AND lat > :minlat 
    AND lon < :maxlon AND lon > :minlon

索引表格的最佳解决方案是什么?一个两列索引?两列上有两个索引?空间索引?

我想知道在这种情况下是否真的需要空间索引,因为你需要一个特殊的列,特定的库,所有这些都是以牺牲数据库的可移植性和简单性为代价的.

注意:我想保持这个问题与数据库无关,但为了完整起见,我提到了我正在使用PostGresql 8,没有(现在)PostGIS.

解决方法

你的Postgresql版本是什么:8.0,8.1等?如果您有“高版本”,则可以尝试将lat和lon列包含为点类型的唯一列.像这样:

create table MyTable (
   ...
   lat  integer,lon  integer,coor point,...
);

insert MyTable (...,lat,lon,coor,...) values (...,lat1,lon1,'(lat1,lon1)',...)
...

并创建测试所需的索引:

create index MyTable_lat on MyTable (lat);
create index MyTable_lon on MyTable (lon);
create index MyTable_coor on MyTable using gist (coor);

现在,您可以更快地测试哪种类型的查询

explain analyze
select * 
from MyTable 
where lat < :maxlat and lat > :minlat 
and lon < :maxlon and lon > :minlon

要么:

explain analyze
select * 
from MyTable 
where coor <@ Box '((:minlat,:minlon),(:maxlat,:maxlon))'

我在Postgresql 9上做了测试(有20000条记录),第二个选项更快.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐