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": "simplephp1@163.com", "gps": [ 104.067221, 30.620076 ]}{ "_id": ObjectId("518b1dae83ba88d660000000"), "account": "simplephp6@163.com", "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、架构、算法分类,被贴了 geohash、LBS、Mongodb、Mysql 标签。
Mysql or Mongodb LBS快速实现方案的更多相关文章
- mysql迁移之巨大数据量快速迁移方案
mysql迁移之巨大数据量快速迁移方案-增量备份及恢复 --chenjianwen 一.前言: 当mysql库的大小达到几十个G或者上百G,迁移起来是一件非常费事的事情,业务中断,导出导入耗费大量的时 ...
- 转:视觉中国的NoSQL之路:从MySQL到MongoDB
起因 视觉中国网站(www.chinavisual.com)是国内最大的创意人群的专业网站.2009年以前,同很多公司一样,我们的CMS和社区产品都构建于PHP+Nginx+MySQL之上:MySQL ...
- MySQL、MongoDB、Redis 数据库之间的区别
NoSQL 的全称是 Not Only SQL,也可以理解非关系型的数据库,是一种新型的革命式的数据库设计方式,不过它不是为了取代传统的关系型数据库而被设计的,它们分别代表了不同的数据库设计思路. M ...
- MySQL、MongoDB、Redis 数据库之间的区别与使用(本章迭代更新)
MySQL.MongoDB.Redis 数据库之间的区别与使用 MySQL.MongoDB.Redis 数据库之间的区别与使用(本章迭代更新) update:2019年2月20日 15:21:19(本 ...
- MySQL与MongoDB的区别
一.MongoDB简介 什么是MongoDB ?MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.MongoDB 旨 ...
- MySql、Mongodb和Redis的区别
NoSQL 的全称是 Not Only SQL,也可以理解非关系型的数据库,是一种新型的革命式的数据库设计方式,不过它不是为了取代传统的关系型数据库而被设计的,它们分别代表了不同的数据库设计思路. M ...
- 上亿数据怎么玩深度分页?兼容MySQL + ES + MongoDB
面试题 & 真实经历 面试题:在数据量很大的情况下,怎么实现深度分页? 大家在面试时,或者准备面试中可能会遇到上述的问题,大多的回答基本上是分库分表建索引,这是一种很标准的正确回答,但现实总是 ...
- MySQL和Mongodb的区别与应用场景对比
MySQL是关系型数据库 优势: 在不同的引擎上有不同 的存储方式. 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高. 开源数据库的份额在不断增加,mysql的份额页在持续增长. 缺点 ...
- MySQL导入MongoDB
一.MongoDB的导入导出 mongoDB的导入导出,分为mongoDB官方提供的工具类,和第三方的工具类.下面依次介绍下: 1.1.mongoDB提供的工具 1.1.1.mongoimport工具 ...
随机推荐
- jdbc链接mysql转
完整java开发中JDBC连接数据库代码和步骤 JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的 ...
- 使用 PHP 和 Apache Solr 实现企业搜索
原文链接:http://www.ibm.com/developerworks/cn/opensource/os-php-apachesolr/ http://blog.csdn.net/hzcyc ...
- android-详解Android 6.0运行时权限
感谢郭神,从Android 6.0开始,不再是安装应用时用户确定获得全部的权限.而是在使用软件过程中需要该权限时,弹出对话框让用户选择权限.不仅如此,用户选择权限后还可以关闭. 检查是否获得权限 通过 ...
- linux读写ntfs
frankly speaking, i hope to get a higher salary. yours frankly= yours sincerely = sincerely yours =y ...
- HDU4891_The Great Pan_字符串水题
2014多校第五题,当时题面上的10^5写成105,我们大家都wa了几发,改正后我和一血就差几秒…不能忍 题目:http://acm.hdu.edu.cn/showproblem.php?pid=48 ...
- Stream探究
http://segmentfault.com/a/1190000003479884 1. 认识Stream Stream的概念最早来源于Unix系统,其可以将一个大型系统拆分成一些小的组件,然后将这 ...
- DateTime季度的计算
//获取本季度的第一天 DateTime.Now.AddMonths(0 - (DateTime.Now.Month - 1) % 3).ToString("yyyy-MM-01" ...
- dedecms后台批量替换文章中的关键词
DEDECMS怎么样能快捷或者批量修改网站所有文章的超链接和锚文本,超链和所有关键词锚文本的链接需要修改? dedecms后台批量替换文章中的关键词
- DICOM:DICOM3.0网络通信协议(续)
转载:http://blog.csdn.net/zssureqh/article/details/44278693 题记: 近一年来一直坚持周末写博客,整理工作和闲暇之余的点点滴滴.对于新知识点.新技 ...
- error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status
Windows服务器Azure云编译安装MariaDB教程 www.111cn.net 编辑:future 来源:转载 安装MariaDB数据库最多用于linux系统中了,下文给各位介绍在Window ...