Lau*_*ire 6 database postgresql postgis
我有一个包含两列的表格:纬度和经度。我想将所有对象放入“矩形”(好吧,纬度/经度坐标度量中的矩形)边界框内:最小-最大纬度和最小-最大经度。基本上归结为以下伪SQL:
SELECT * FROM MyTable WHERE lat < :maxlat AND lat > :minlat
AND lon < :maxlon AND lon > :minlon
Run Code Online (Sandbox Code Playgroud)
索引我的表的最佳解决方案是什么?两列索引?两列上的两个索引?空间索引?
我想知道在这种情况下是否真的需要空间索引,因为您需要一个特殊的列、特定的库,所有这些都以牺牲数据库的可移植性和简单性为代价。
注意:我想保持这个问题与数据库无关,但为了完整起见,我提到我正在使用 PostGreSQL 8,没有(现在)PostGIS。
您的 PostgreSQL 版本是什么:8.0、8.1 等?如果您有“高版本”,您可以尝试将纬度和经度列包含为点类型的唯一列。像这样:
create table MyTable (
...
lat integer,
lon integer,
coor point,
...
);
insert MyTable (..., lat, lon, coor, ...) values (..., lat1, lon1, '(lat1, lon1)', ...)
...
Run Code Online (Sandbox Code Playgroud)
并创建测试所需的索引:
create index MyTable_lat on MyTable (lat);
create index MyTable_lon on MyTable (lon);
create index MyTable_coor on MyTable using gist (coor);
Run Code Online (Sandbox Code Playgroud)
现在您可以测试哪种类型的查询更快:
explain analyze
select *
from MyTable
where lat < :maxlat and lat > :minlat
and lon < :maxlon and lon > :minlon
Run Code Online (Sandbox Code Playgroud)
或者:
explain analyze
select *
from MyTable
where coor <@ box '((:minlat,:minlon),(:maxlat,:maxlon))'
Run Code Online (Sandbox Code Playgroud)
我在 PostgreSQL 9(有 20000 条记录)上进行了测试,第二个选项更快。