MySQL 5.7 GIS特性

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

你可能感兴趣的:(MySQL 5.7 GIS特性)