Mysql or Mongodb LBS快速实现方案

http://www.wubiao.info/470

前两篇文章:

查找附近的xxx 球面距离以及Geohash方案探讨 (http://www.wubiao.info/372

微信、陌陌 架构方案分析 (http://www.wubiao.info/401

探讨了,LBS查找附近的XXX;其中包括了,Mysql自定义存储函数方案,以及通过GeoHash、redis自建索引方案。

===============================================================

今天分享两种,利用GeoHash封装成内置数据库函数的简易方案;

A:Mysql 内置函数方案,适合于已有业务,新增加LBS功能,增加经纬度字段方可,避免数据迁移

B:Mongodb 内置函数方案,适合中小型应用,快速实现LBS功能,性能优于A(推荐)

===============================================================

方案A: (MySQL Spatial)

1、先简历一张表:(MySQL 5.0 以上 仅支持 MyISAM 引擎)


1

2

3

4

5

6

7

8

9

CREATE TABLE address (

    address CHAR(80) NOT NULL,

    address_loc POINT NOT NULL,

    PRIMARY KEY(address)

);

空间索引:


1

ALTER TABLE address ADD SPATIAL INDEX(address_loc);

插入数据:(注:此处Point(纬度,经度) 标准写法)


1

2

3

INSERT INTO address VALUES(‘Foobar street 12‘, GeomFromText(‘POINT(30.620076 104.067221)‘));

INSERT INTO address VALUES(‘Foobar street 13‘, GeomFromText(‘POINT(31.720076 105.167221)‘));

查询: 查找(30.620076,104.067221)附近 10 公里


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

SELECT  *

    FROM    address

    WHERE   MBRContains

                    (

                    LineString

                            (

                            Point

                                    (

                                    30.620076 + 10 / ( 111.1 / COS(RADIANS(104.067221))),

                                    104.067221 + 10 / 111.1

                                    ),

                            Point

                                    (

                                    30.620076 - 10 / ( 111.1 / COS(RADIANS(104.067221))),

                                    104.067221 - 10 / 111.1

                                    )

                            ),

                    address_loc

                    )

方案B:

1、先建立一张简单的表user,两条数据如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

{

  "_id": ObjectId("518b1f1a83ba88ca60000001"),

  "account": "[email protected]",

  "gps": [

    104.067221,

    30.620076

  ]

}

{

  "_id": ObjectId("518b1dae83ba88d660000000"),

  "account": "[email protected]",

  "gps": [

    104.07958,

    30.653936

  ]

}

其中,gps为二维数组,分别为经度,纬度

(注:此处必须按照(经度,纬度)顺序存储。我们平时表示经纬度,都是(纬度,精度),此处这种方式有木有很亲民)

2、使用之前,先建立二维索引

//建立索引 最大范围在经度-180~180


1

db.user.ensureIndex({"gps":"2d"},{"min":-180,"max":180})

//删除索引


1

db.user.dropIndex({"gps":"2d"})

3、Mongodb有两中方式可以查找附近的XXX;其中方案2)会返回距离(推荐)

1)标准查询,为地球经纬度查询内置;参数一为查询条件利用$near查找附近,参数二$maxDistance为经纬弧度(1° latitude = 111.12 kilometers)即 1/111.12,表示查找附近一公里。


1

db.user.find({ gps :{ $near : [104.065847, 30.657554] , $maxDistance : 1/111.12} })

2)执行命名方式,模拟成一个圆球;参数一指定geoNear方式和表名;参数二坐标,参数三是否为球形,参数四弧度(弧度=弧长/半径 一千米的弧度1000/6378000),参数五指定球形半径(地球半径)


1

db.runCommand({geoNear:‘user‘, near:[104.065847, 30.657554], spherical:true, maxDistance:1000/6378000, distanceMultiplier:6378000});

本条目发布于2013年05月28日。属于DB架构算法分类,被贴了 geohashLBSMongodbMysql 标签。

时间: 2024-11-06 11:42:21

Mysql or Mongodb LBS快速实现方案的相关文章

MySQL数据库高可用快速实施方案

Note:以下为MySQL+DRBD+HEARTBEAT快速实施文档,若要用于生产环境,请仔细阅读官方文档并结合实际业务调整参数,涉及数据部署请慎重!!! (个人建议:在基于个人熟悉服务的情况下并通过测试环境才可在线上使用.) 数据库高可用 MySQL+DRBD+HEARTBEAT实施方案 环境: mysql-5.5.49 heartbeat-3.0.4-2.el6.x86_64 drbd84-utils-8.9.8-1.el6.elrepo.x86_64 CentOS release 6.7

mysql迁移之巨大数据量快速迁移方案

mysql迁移之巨大数据量快速迁移方案-增量备份及恢复 --chenjianwen 一.前言: 当mysql库的大小达到几十个G或者上百G,迁移起来是一件非常费事的事情,业务中断,导出导入耗费大量的时间:所以,需要考虑怎么去节省时间的问题. 二.方案: 1.制定维护时间,中断业务,登录 mysql,刷新日志 2.全备数据,备份后得到 binlog 日志文件 mysql-bin.000001 3.迁移走之前的 binlog 日志文件,只留下 mysql-bin.000001 4.恢复业务 5.将全

MySQL与MongoDB的区别

一.MongoDB简介 什么是MongoDB ?MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成.MongoDB 文档类似于 JSON 对象.字段值可以包含其他文档,数组及文档数组. 主要特点MongoDB的提供了一个面向文档存储,操作起来比较简单和容易.你可以在

MySQL、MongoDB、Redis 数据库之间的区别与使用(本章迭代更新)

MySQL.MongoDB.Redis 数据库之间的区别与使用 MySQL.MongoDB.Redis 数据库之间的区别与使用(本章迭代更新) update:2019年2月20日 15:21:19(本章迭代更新) 一.数据库之间的区别 MySQL MySQL概述 关系型数据库.无论数据还是索引都存放在硬盘中.到要使用的时候才交换到内存中.能够处理远超过内存总量的数据. 在不同的引擎上有不同 的存储方式. 查询语句是使用传统的 SQL 语句,拥有较为成熟的体系,成熟度很高. 开源数据库的份额在不断

Mysql和Mongodb的区别与应用场景对比

MySQL是关系型数据库 优势: 在不同的引擎上有不同 的存储方式. 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高. 开源数据库的份额在不断增加,mysql的份额页在持续增长. 缺点: 在海量数据处理的时候效率会显著变慢. Mongodb是非关系型数据库(nosql ),属于文档型数据库 文档是mongoDB中数据的基本单元,类似关系数据库的行,多个键值对有序地放置在一起便是文档,语法有点类似javascript面向对象的查询语言,它是一个面向集合的,模式自由的文档型数据库.

MYSQL 主从同步故障-Error1062--解决方案

MYSQL 主从同步故障-Error1062-解决方案 公司有两台Mysql服务器之前配置了主从同步,今天用户反映数据有差异,登陆到服务器上查看Mysql主从配置,发现有错误: show slave status \G;  果然出现问题了 Slave_IO_Running: Yes Slave_SQL_Running: No 而且出现了1062错误 Last_SQL_Error: Error 'Duplicate entry '1001-164761-0' for key 'PRIMARY''

pmm 监控mysql、mongodb、系统

Pmm监控 1.概述 Pmm是(percona management and monitoring)一款用于数据库(mysql.mongodb)的监控工具,是一种典型的C/S架构.本次部署采用的是docker,pmm-server端包括数据汇集.展示等,pmm-client主要是部署在需要监控的服务器上,用于数据收集.Pmm-server比较占系统资源,建议将其安装在单独一台服务器上面或安装在一台性能比较好的服务器上. 2.部署server端 系统环境:centos7.2 Docker:1.12

MySQL与MongoDB的操作对比,以及区别

MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库.它们各有各的优点,关键是看用在什么地方.所以我们所熟知的那些SQL(全称Structured Query Language)语句就不适用于MongoDB了,因为SQL语句是关系型数据库的标准语言. 以我们公司项目为例,在早期的项目中,都在使用关系型数据库,用过SQLServer,Oracle,DB2,后来全部转向Mysql,原因很简单:

[转]MySQL与MongoDB的操作对比

MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库.它们各有各的优点,关键是看用在什么地方. 以我们公司项目为例,在早期的项目中,都在使用关系型数据库,用过SQLServer,Oracle,DB2,后来全部转向Mysql,原因很简单:Mysql在性能不错的情况下,有着开源优势.Mysql的事务性与高性能是我们主要考虑的.后来,由于项目要用到用户系统,即会有大量的用户数据进行交互--海量存