mongodb中地理位置信息类型及性能初探
2014-04-27 13:39
253 查看
Posted on
February 26, 2013 by
liubin
1. 问题的引出
前两天说到LBS系统里如何找到附近的点,假如数据库存储如下信息{x,y}分表表示经度和纬度(这里统统存为正数,方便计算),那么如果取得当前位置信息(x1,y1)如何去数据库里查附近的信息(记录)呢?最原始的想法差不多是:
很显然,这样的话数据库性能会很差的。
那好,根据每个点的信息,作出一个位置指数
loc_index = (x + 360 ) + y
这样,loc_index的值的范围应该在360 到 360 + 360 + 180之间,
然后再选择的时候计算出{x1,y1}的loc_index1,在从数据库里找到相同的值就行了,或者按差值排列。
缺点:计算量,复杂,不好统计距离,山寨,不官方,非权威,不能统计圆形区域,等等。也许存在逻辑错误,但这只是一种假设,因为这不是要确实去实现它,只是失眠想到的一件事情。
2. mongodb的情况
然后第二天,想到了一些NoSql支持这种geo类型,甚至包括PostgreSql都支持了。。
那就拿来试试吧,最简单的就是mongodb了。
本来想用1000w条数据试的,但是可能和OS有关,插入到600w条的时候就死了,再启动出错,repair也不行,最后采用了500w条数据做实验。
数据类型很简单,{place:”some text”,loc : [ -5.9282, 23.222 ] }
插入数据的脚本如下:
以下是实行结果:
从结果看,插入500w条简单数据只用了不到12分钟,占用硬盘情况如下:
将近1G。
数据插入之后,就可以进行查询性能的测试了。
但是输入查询语句后,会发现很悲剧的报错:
对,如同error log说的那样,没有索引,加一个就行了。
在传统的RDBMS里加索引是很耗时的一件事情,mongodb怎样呢?
从上面的shell执行情况及下面的server log
可以看出,加索引过程只用了1分钟左右,效率也是能让人接受的。
接下来,就可以开始测试下查询的性能了。(下面的查询前后都有日期输出,用了确认查询时间)
3. 用$near来查询附近记录
$near用了查找里给定地点最近的记录,并按距离从小到大排列,可以用limit来限定返回记录个数:
也可以用$maxDistance来限定更细致的条件:
4. 用geoNear命令
除了用dbfind查询语句,还可以用geoNear命令来执行上面类似的查询:
5. 根据几何边界来查询
mongodb还根据指定几何形状来限定查询,比如,给定一个矩形或圆形,来查询在这个范围内的记录。这通过使用$within参数来实现:
当然,除了矩形,也可以根据给定的圆心和半径来查询圆形范围内的点:
总结一下,mongodb对geo类型的支持还是很全面很方便的,最关键的是性能是完全可以接受的。
注:
系统测试环境
Dell OptiPlex 360
Win XP Service Pack 3
CPU 2.6G
内存 3G
转自:http://liubin.org/2013/02/26/geo_data_type_and_performance_in_mongodb/
February 26, 2013 by
liubin
1. 问题的引出
前两天说到LBS系统里如何找到附近的点,假如数据库存储如下信息{x,y}分表表示经度和纬度(这里统统存为正数,方便计算),那么如果取得当前位置信息(x1,y1)如何去数据库里查附近的信息(记录)呢?最原始的想法差不多是:
那好,根据每个点的信息,作出一个位置指数
loc_index = (x + 360 ) + y
这样,loc_index的值的范围应该在360 到 360 + 360 + 180之间,
然后再选择的时候计算出{x1,y1}的loc_index1,在从数据库里找到相同的值就行了,或者按差值排列。
缺点:计算量,复杂,不好统计距离,山寨,不官方,非权威,不能统计圆形区域,等等。也许存在逻辑错误,但这只是一种假设,因为这不是要确实去实现它,只是失眠想到的一件事情。
2. mongodb的情况
然后第二天,想到了一些NoSql支持这种geo类型,甚至包括PostgreSql都支持了。。
那就拿来试试吧,最简单的就是mongodb了。
本来想用1000w条数据试的,但是可能和OS有关,插入到600w条的时候就死了,再启动出错,repair也不行,最后采用了500w条数据做实验。
数据类型很简单,{place:”some text”,loc : [ -5.9282, 23.222 ] }
插入数据的脚本如下:
数据插入之后,就可以进行查询性能的测试了。
但是输入查询语句后,会发现很悲剧的报错:
在传统的RDBMS里加索引是很耗时的一件事情,mongodb怎样呢?
接下来,就可以开始测试下查询的性能了。(下面的查询前后都有日期输出,用了确认查询时间)
3. 用$near来查询附近记录
$near用了查找里给定地点最近的记录,并按距离从小到大排列,可以用limit来限定返回记录个数:
除了用dbfind查询语句,还可以用geoNear命令来执行上面类似的查询:
mongodb还根据指定几何形状来限定查询,比如,给定一个矩形或圆形,来查询在这个范围内的记录。这通过使用$within参数来实现:
注:
系统测试环境
Dell OptiPlex 360
Win XP Service Pack 3
CPU 2.6G
内存 3G
转自:http://liubin.org/2013/02/26/geo_data_type_and_performance_in_mongodb/
相关文章推荐
- IOS模拟器能获取运营商信息,网络连接类型以及地理位置吗?
- IOS模拟器能获取运营商信息,网络连接类型以及地理位置吗?
- 微信获取用户地理位置信息-微信jsapi接口
- js+html5获取用户地理位置信息并在Google地图上显示的方法
- 百度地图api应用标注地理位置信息(js版)
- 地理位置信息
- 【转载】Linux下显示IP地理位置信息的小工具-nali
- 图解GeoHash算法--MongoDB 地理位置索引的实现原理
- mongodb底层存储和索引原理——本质是文档数据库,无表设计,同时wiredTiger存储引擎支持文档级别的锁,MMAPv1引擎基于mmap,二级索引(二级是文档的存储位置信息『文件id + 文件内offset 』)
- 通过window.navigator对象获取地理位置信息并在百度地图上显示
- Android将地理位置存储到图片扩展信息EXIF
- 图解 MongoDB 地理位置索引的实现原理
- 数加平台 Quick BI 填坑之地理位置信息转换问题
- 根据经纬取点的地理位置信息
- Android中通过Exifinterface读取图片地理位置信息
- WPF 异常其他信息: “对类型“BaseControl.KImgButton”的构造函数执行符合指定的绑定约束的调用时引发了异常。”,行号为“38”,行位置为“22”。
- 高德地图API 之 获得某一区域下某地方的 地理位置信息
- HTML5 获取地理位置信息
- JSP通过IP获取用户(客户端)的地理位置信息
- 给Asus WL500G Deluxe无线路由器日志文件添加IP地址地理位置信息的Python小程序