移动互联网络的飞速发展,导致移动应用类服务层出不穷,其中很重要一类就是LBS(Location Based Services)——位置定位服务,在此基础上出现了很多面向生活服务类的热门App应用,如:快的打车,陌陌等。如何能根据你现在的地理位置,找到离你最近的商店等需求,已经成为每个智能终端(如手机)的必备功能。

LBS类应用,除了前端的App,后台主要通过数据库进行数据支撑,除却网络因素外,数据库性能和对空间数据的支持程度,直接影响用户请求响应时间,波及用户体验。所以选择一个正确而合适的数据服务应用,对LBS类服务来说是至关重要的。

如何选择合适的数据服务,跟许多因素有关,需要考虑预估数据量规模、并发请求数量和预期投入成本等等因素。而本文档的主要目的,就是通过比较几种常用的LBS数据服务产品,找出在哪种场景下,采用哪种数据服务产品,给具体不同的业务,提供LBS数据服务产品选型。

目前能提供空间数据存储的数据服务产品比较多,如:Oracle Spatial、MySQL Spatial、PostGIS、MongoDB、Lucene Spatial等等。上述产品中,除了Oracle Spatial外,其余4中都是开源的数据库产品,我们本次对比的范围,正是基于这4种能够提供空间数据存储的产品。

MySQL本身就自带空间类型数据,如Point,Polygon,LineString等等,MySQL 5.6开始MyISAM储存引擎开始支持空间索引(Spatial Index),MySQL 5.7.5开始,InnoDB存储引擎也开始支持Spatial Index索引。

MySQL对空间数据支持

MySQL Spatial只支持了OpenGIS的一个子集,实现了其中基本功能如GeoFromText等等。MySQL InnoDB在使用Spatial Index时,需要使用自带的函数如MBRContains等。还有就是MySQL Spatial计算距离的时候计算的是欧式空间距离(直线距离),而一般LBS应用中计算的距离是球面距离。

索引结构

InnoDB Spatial Index采用R树建立索引,由于R树的特殊性,计算距离的时候是计算外接矩形的距离,所以在精确度上可能有所偏差。

R树结构图

R树的叶子节点为具体的坐标点,而父节点则为所有子节点的外接矩形

当需要搜索某个区域时,比如:距离天安门3公里内的便利店

以天安门为中心,半径为3公里的外接正方形建立需要查找的区域

从根节点开始搜索整棵R树

如果搜索的区域与R树上的节点相交,则说明该节点下有需要搜索的坐标

依次遍历相交节点,直到叶子节点为止

扫描所有叶子节点,获取在搜索范围内的点

索引示例

InnoDB建立包含空间索引信息通过关键字SPATIAL进行指定,如下:

CREATE TABLE Person(

id INT PRIMARY KEY AUTO_INCREMENT,

name VARCHAR(64),

sex ENUM(‘M’, ‘F’),

age INT,

address VARCHAR(256) NOT NULL,

address_loc POINT NOT NULL,

SPATIAL KEY(address_loc))ENGINE=INNODB;

数据备份

MySQL支持Master-Slave等复制方式,通过Master-Slave来保证数据的高可靠性和系统的高可用性

数据复制

MySQL对空间数据类型本来就支持,所以在数据备份时,可以利用MySQL数据备份工具进行,如:xtrabackup、mydumper、mysqldump等等

数据扩展

MySQL本身支持分库分表,但不支持负载均衡,需要通过中间件如MySQL-Proxy、MySQL Fabric、DDB等提供支持

优点

基于MySQL数据库,MySQL本身产品的关注度和社区成熟度比较高

支持Spatial Index

支持事务操作

缺点

对于空间扩展支持偏弱

对空间支持部分刚起步,正式的应用不多

Scale out比较困难,需要中间件支持

PostGIS是基于PostgreSQL上面的一个扩展,与MySQL不同的是PostgreSQL本身不支持空间数据类型,需要在PostgreSQL基础上安装PostGIS扩展后才能存储空间数据。

PostGIS单从功能上来讲,是除了Oracle Spatial外对空间数据支持最好的一个产品,基本上支持OpenGIS的规范实施的,当然其支持的数据类型和函数也比MySQL spatial丰富得多。

PostGIS支持几乎所有的空间数据类型,包括:POINT、LINESTRING、POLYGON、MULTIPOLYGON等等,当然PostGIS还提供大量以ST开头的空间处理函数,如ST_AsBinary、ST_GeoFromText等。

除了上面这些基本功能外,PostGIS还提供:

数据坐标变换

球体长度计算

三维几何类型

空间聚集函数

栅格数据类型

索引结构

PostGIS空间索引实现有两种不同的选择:R树和GIST(Generalized Search Tree),一般建立索引的时候选用GIST,GIST本身就是一种R树的变种,在R树基础上进行了改进

PostgreSQL中,GIST相比R树的优点:

GiST indexes have two advantages over R-Tree indexes in PostgreSQL. Firstly, GiST indexes are "null safe", meaning they can index columns which include null values. Secondly, GiST indexes support the concept of "lossiness" which is important when dealing with GIS objects larger than the PostgreSQL 8K page size. Lossiness allows PostgreSQL to store only the "important" part of an object in an index -- in the case of GIS objects, just the bounding box. GIS objects larger than 8K will cause R-Tree indexes to fail in the process of being built.

CREATE INDEX index_name ON TABLE table_name USING GIST (geometryfield)

数据备份

可以通过pg_dump和pg_restore等工具进行备份和恢复

数据复制

PostgreSQL-9.1.2后支持Streaming Replication复制,可以配置Primary和Standby节点

数据扩展

PostGIS可以通过PostgreSQL的中间件pgpoll-II实现分库分表

优点

对空间数据类型支持丰富(更多类型、函数,坐标变换等等)

缺点

PostgreSQL本身布支持地理信息,需要部署PostgreSQL和PostGIS两部分

Scale out比较困难,需要部署pgpool-II中间件,操作起来也比较复杂

MongoDB区别于MySQL和PostGIS,MongoDB不支持SQL查询,MongoDB是介于关系型数据库和NoSQL之间的一种文档型数据库。相对于MySQL和PostGIS而言,MongoDB使用简单,而且内嵌了很多对Spatial的支持。

MongoDB采用journal日志保证数据不会被大面积丢失(相当于MySQL的redo log),采用oplog实现主从节点的数据同步(相当于MySQL的binlog)

MongoDB从3.0版本开始集成了WiredTiger存储引擎,全面支持数据压缩和基于Doc级别的锁,极大的增大了系统的可用性和并发性能。

MongoDB插入带有地理位置信息的数据:

db.person.insert(

{

‘name’:’john’,

‘sex’:’M’,

‘age’:18,

‘address’:’London’,

‘address_loc’:{‘lat’:40.12345, ‘long’:120.34567}

})

MongoDB基于地理位置创建索引

db.person.ensureIndex(‘address_loc’, ‘2d’)

根据给定的[long,lat]点,查找附近的数据

db.person.find({“address_loc” : {$near : [long, lat]]}})

索引结构

MongoDB采用Geohash方式建立空间索引,Geohash即把二维的空间坐标转换成一维字符串

Geohash示例图

Geohash的主要原理就是把一张图切成若干等分,其中每一块用一个字符串表示,比如上左图中,00、01、10、11分别代表一块,按照这种方法,只要切分的够细(误差在允许范围之内),每个坐标点就可以用一块来表示,即把二维坐标转化成了一维字符串。Geohash可以根据字符串的精确度不同来分别搜索距离目标点不同距离的点。

数据备份

MongoDB内部自带Spatial extensions,数据备份等都采用MongoDB自身工具(mongodump、mongorestore、mongoexport、mongoimport)

数据复制

MongoDB支持基于Master-Slave的主从复制,和基于Replica Pairs的副本集复制,Master-Slave复制与MySQL类似,Replica Pairs复制可以在Master宕机的情况下,自动选取一个节点作为主机对外提供服务。

数据扩展

MongoDB支持自动和手动的sharding功能,利用Replica Pairs和sharding功能,很容易在不停服的情况下,为数据库集群实现scale out扩展。

优点

MongoDB面向文档存储,记录为BSON形式,没有严格数据格式

支持Master-Slave复制和Replica Pairs,实现自动故障转移

支持手动和自动sharding切片,实现数据水平扩展

支持动态查询

支持全文索引

支持地理空间信息和空间索引,内嵌空间计算函数

缺点

单个文档大小限制16M

不支持SQL和事务操作

不支持多个collection上join操作

MongoDB采用mmap形式映射全部数据到内存空间,对内存占用比较高

本文来自网易实践者社区,经作者蒋鸿翔授权发布。

mysql lbs_LBS类数据服务对比分析 (一)相关推荐

  1. 最佳网络地图服务对比分析:Google Maps 与 OpenStreetMap

    有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡. 生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道,你要走的弯路就会越少. 就制图师而言,Goog ...

  2. NFS、GFS、NAS文件存储服务对比分析

    <一>NFS NFS 是Network File System的缩写,中文解释是网络文件系统,它是FreeBSD支持的文件系统中的一种,它容许网络中的计算机之间经过TCP/IP网络共享资源 ...

  3. 微服务技术栈:常见注册中心组件,对比分析

    本文源码:GitHub·点这里 || GitEE·点这里 一.注册中心简介 1.基础概念 在分布式架构的系统中注册中心这个概念就已经被提出了,最经典的就是Zookeeper中间件. 微服务架构中,注册 ...

  4. mysql bulk update_Django bulk_create()、update()与数据库事务的效率对比分析

    下面以创建10000个对象为例进行测试: # 用for循环挨个创建,共花费37秒 for i in range(10000): name="String number %s"%i ...

  5. 常见微服务框架和对比分析

    常见的微服务框架 第一代微服务框架  SpringCloud Spring Boot:快速开发微服务的框架(可以快速开发出一个单体微服务项目) SpringCloud 为开发者提供了快速构建分布式系统 ...

  6. GAE、SAE与BAE的对比分析

    GAE.SAE与BAE的对比分析 本文主要从以下几个方面对GAE.SAE和BAE的优劣进行分析. 数据库 GAE 目前使用 Datasotre 存取数据,最近也提供了云 SQL(MySQL),但申请比 ...

  7. 一点杂感 以及 java8 Streams API 与 C# Linq 简要对比分析

    写在前面的一点小吐槽.一点杂感 学 Haskell 学了一段时间之后,虽说拿他来写东西还是完全不行,但是看别的语言特性时,总是会带着一种"诶,这玩意在哪哪见过"的蜜汁既视感.且不说 ...

  8. 阿里云交互式分析与Presto对比分析及使用注意事项

    阿里云交互式分析与Presto对比分析及使用注意事项 本文由阿里巴巴耿江涛带来以"阿里云交互式分析与Presto对比分析及使用注意事项"为题的演讲.文章首先介绍了Presto以及它 ...

  9. Portal产品对比分析报告

    目录 1概述 2Portal相关产品介绍 2.1商业Portal 2.1.1Bea weblogic portal 2.1.2IBM websphere portal 2.1.3Oracle port ...

最新文章

  1. android 释放 so,这 10 个值得开启的隐藏功能,让你的 Chrome 释放更多潜力
  2. HX711电子秤专用转换芯片读取MCU模块
  3. vscode进行远程服务器 An SSH installation couldn't be found、
  4. 十一课堂|通过小游戏学习Ethereum DApps编程(4)
  5. 003_SQL语言简介
  6. html5 自动生成迷宫,HTML5 Canvas随机迷宫生成动画
  7. flex datagrid 导出csv
  8. java开源库web3j的以太坊过滤器(filter)和智能合约事件(event)教程
  9. SAP UI5 debug mode
  10. 懒惰的JSF Primefaces数据表分页–第2部分
  11. Android颜色渐变的分隔线(ListView)
  12. Windows平台下使用Active Directory对Subversion进行权限控制(非完美解决方案)
  13. java 小题目_java一个小题目
  14. express中间件系统的基本实现
  15. 基于Android的家庭财务管理流程图,SYL_Android_FamilyFinaceSystem 双鱼林基于安卓Android家庭财务管理系统毕业课程设计源码 - 下载 - 搜珍网...
  16. 抢饭碗?这位 05 后开发三款小程序!
  17. linux python mysqldb安装包,linux环境下python中MySQLdb模块的安装方法
  18. 插件基础篇3:jquery 插件开发备注
  19. 使用npm-check-updates模块升级插件
  20. 利用PlaySound函数播放音频文件

热门文章

  1. 经典网络结构 (八):轻量化网络 (SqueezeNet, MobileNet, ShuffleNet)
  2. 语音合成之文本转语音
  3. c语言全部题目及答案,C语言全部题目及答案
  4. 如何实现在线直播源码的美颜功能——接入美颜SDK
  5. Bullshit Bingo
  6. 单片机七阶音符_单片机 演奏音符
  7. 通信原理Matlab仿真:模拟信号的幅度调制
  8. 192.168.8.1手机登陆_192.168.8.1手机登陆路由器设置教程
  9. 关于网站域名备案流程
  10. python数据分析之Pandas-3