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

标签 database postgresql postgis

我有一个包含两列的表格:纬度和经度。我想让所有对象都在一个“矩形”(嗯,在纬度/经度坐标度量中的矩形)边界框内:最小-最大纬度和最小-最大经度。基本上可以归结为以下伪 SQL:

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

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

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

注意:我想让这个问题与数据库无关,但为了完整起见,我提到了一个事实,即我正在使用 PostGreSQL 8,没有(目前)PostGIS。

最佳答案

您的 PostgreSQL 版本是什么:8.0、8.1 等?如果您有“高版本”,您可以尝试将 latlon 列作为点类型的唯一列。像这样:

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 条记录)上做了测试,第二个选项更快。

关于database - 空间索引与两个坐标索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9201024/

相关文章:

c# - 在 xamarin forms pcl 上执行查询时没有这样的表 sqlite

Spring Boot data-jpa 和 nativeQuery Postgres cast

nhibernate - 如何从 NHibernate 映射文件生成 "migration"DDL?

hadoop - 可以在没有 Postgres 的情况下使用 PostGIS 库吗?

在postgresql中使用窗口函数的SQL查询累计总和

mysql - MySQL 何时尝试更新列的索引?

c# - Entity Framework 中的 Linq 查询优化

android - Realm block Gson 库

PostgreSQL : using a statement as case condition

postgis - 在 PostGIS 中,大于半个世界的多边形被视为相反的多边形