GIS特性 版本支持情况
MySQL 5.7版本之前只有MyISAM引擎支持空间数据;
MySQL 5.7版本之前只有MyISAM支持R树查询;
MySQL 5.7版本之前地理空间类型性能比较一般;
MySQL 5.7版本之前地理空间函数支持度有限;
MySQL 5.7版本之前不支持GeoHash以及GeoJson;
基于此,业界的LBS应用大多基于MongoDB数据库,因为MongoDB内置的geoindex非常好用,外加分片特性非常适合于LBS这样的应用。
对于事务要求较高的应用场景,也有公司使用PostGIS。
MySQL 5.7 GIS改进
通过Boost Geometry库重构之前的地理空间数据的代码实现;
增加很多通用的GIS函数,比如球面举例的计算函数ST_Distance_Sphere等;
InnoDB存储引擎原生支持地理空间数据类型
InnoDB存储引擎新增R树索引支持地理空间查询
下载测试数据集 OpenStreeMap
测试
导入下载数据集,表结构如下:
CREATE TABLE nodes (
id bigint(20) DEFAULT NULL,
geom geometry NOT NULL,
geohash VARCHAR(128) AS (st_geohash(geom,6)) VIRTUAL,
user varchar(50) DEFAULT NULL,
version int(11) DEFAULT NULL,
timestamp varchar(20) DEFAULT NULL,
uid int(11) DEFAULT NULL,
changeset int(11) DEFAULT NULL,
UNIQUE KEY idx_nodes_id (id),
SPATIAL KEY idx_nodes_geom (geom),
key idx_nodes_geohash(geohash)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
执行最常见的LBS需求:
查找某个经纬度周围5公里的节点信息,并根据距离进行排序
-- R树索引
SELECT id,
ST_Distance_Sphere(Point(120.167673,30.259498), geom) as distance,
ST_AsText(geom) geom
FROM nodes
WHERE ST_Contains( ST_MakeEnvelope(
Point((120.167673+(5/111)), (30.259498+(5/111))),
Point((120.167673-(5/111)), (30.259498-(5/111)))
), geom )
ORDER BY distance LIMIT 10;
-- GeoHash
-- ST_Geohash
SELECT id,
ST_Distance_Sphere(Point(120.167673,30.259498), geom) as distance,
ST_AsText(geom) geom
FROM nodes
WHERE geohash IN ('wtmknk','wtmkn6','wtmkne','wtmkn5','wtmknh','wtmkns','wtmknd','wtmkn4','wtmkn7')
ORDER BY distance LIMIT 10