Bootstrap

mysql 地理空间索引_空间索引 - 各数据库空间索引使用报告

空间索引

索引我们都用过,它是一种特殊的存储结构,就像图书馆里书的分类存放策略或是现代化图书馆里的图书查询系统,能帮助我们快速找到自己需要的书。 数据库中,索引的存储一般使用 B树 或 B+树 来实现,通过二分法来查找法来快速定位到数据位置。

普通索引对于一维数据(key->data)是无往不利,可是面对空间数据(lon,lat -> data)就有些无能为力了,如果查询(116.27636, 40.041285)附近的点:

我们在 lon 或 lat 列上创建普通索引,假设是 lon 列,那么通过 lon 列查找到同一经度的数据后,还要在此基础上过滤掉纬度差异过大的数据。

如果在 lon,lat 上创建多列索引,查询到同一经度、纬度相近的数据固然快,但附近的点并不只是经度相同。

如此下来,就要用到空间索引了。空间索引通过 四叉树、R 树等数据结构,还有 GeoHash 算法将二维数据转化为一维使用普通B树索引 来实现,它们都能实现对空间范围内的快速搜索。

可是,今天的主题不在这里,我们的首要目标是要解决问题,这些空间索引的实现改日专门写文章来实现。本文来说一说现有的数据库中对空间索引的支持情况,希望能帮助跟我一样的 GIS 小白进行技术选型。

组内准备切换 poi 数据的存储数据库,花了一周时间安装配置各种数据库来测试空间索引的效率,测试了 Redis, Mongo, PostgreSQL, Mysql 这几个知名的支持空间索引的数据库,技术选型基本完毕,可是中间踩过的坑和配置经验不能丢,详情如下:

Redis

介绍

redis,一个功能强大、效率极高的缓存数据库(或许已经不仅仅是缓存数据库了),已经成为类似于关系存储型数据库在各个项目中不可或缺的组件了。首先考虑它是因为它的效率有保障,而且项目中几乎必备,运维代价很低。Redis 的 空间索引采用 GeoHash 原理,配合集合存储,查询效率接近 log(N)。

Redis 3.0 以上版本支持空间索引,新项目不必考虑这些,而一般的老项目可能就需要升级 Redis 了,另外 PHP 中可能还要升级 Redis 的扩展,以支持 Redis 的空间索引函数。

使用

Redis 的安装配置这里就不再多提了,这里简单地介绍一下 Redis 的 GEO 系列函数。

GEOADD key longitude latitude member [longitude latitude member ...]

GEOADD 将元素添加到集合中,可一次添加多个元素,其对应的 php 函数原型为: geoadd($key, $lon, $lat, $member);

GEORADIUS key lon

;