您的位置:首页 > 数据库 > Mongodb

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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐