当前位置:   article > 正文

地理位置geo处理之mongodb geo 索引

mongo geo

Title: 地理位置geo处理之mongodb geo 索引
Date: 2017-12-01 10:34
Category: 方案

目前越来越多的业务都会基于LBS,附近的人,外卖位置,附近商家等等,现就讨论离我最近这一业务场景的解决方案。

目前已知解决方案有:

  • mysql 自定义函数计算
  • mysql geo索引
  • mongodb geo索引
  • postgresql PostGis索引
  • redis geo
  • ElasticSearch

本文测试下mongodb geo索引 函数运算的性能

准备工作

创建数据表

db.driver.createIndex({loc: "2dsphere"})

创建数据python脚本

  1. # coding=utf-8
  2. from pymongo import MongoClient
  3. import logging
  4. import random
  5. import threading
  6. """ 中国的经纬度范围 纬度3.86~53.55,经度73.66~135.05。大概0.00001度差距1米 """
  7. # 创建 日志 对象
  8. logger = logging.getLogger()
  9. handler = logging.StreamHandler()
  10. formatter = logging.Formatter(
  11. '%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
  12. handler.setFormatter(formatter)
  13. logger.addHandler(handler)
  14. logger.setLevel(logging.DEBUG)
  15. # Connect to the mongodb database
  16. mongoconn = MongoClient('127.0.0.1', 27017)
  17. mdb = mongoconn.geo_analysis
  18. driver_collection = mdb.driver
  19. def ins_driver(thread_name, nums):
  20. logger.info('开启线程%s' % thread_name)
  21. for i in range(nums):
  22. lng = '%.5f' % random.uniform(73.66, 135.05)
  23. lat = '%.5f' % random.uniform(3.86, 53.55)
  24. logging.debug('插入记录:%s' % i)
  25. driver_collection.insert_one({
  26. "loc":[
  27. float(lng),
  28. float(lat)
  29. ]
  30. })
  31. thread_nums = 10
  32. for i in range(thread_nums):
  33. t = threading.Thread(target=ins_driver, args=(i, 40000))
  34. t.start()
4033700-dda526bdfcc5c759.png
image.png

以上脚本创建10个线程,10个线程插入4万条数据。耗费52.43s执行完,总共插入40万条数据

测试

  • 测试环境

系统:mac os

内存:16G

cpu: intel core i5

硬盘: 500g 固态硬盘

测试下查找距离(134.38753,18.56734)附近20公里的司机

db.runCommand({geoNear:'driver', near:[134.38753,18.56734], spherical:true, maxDistance:20000/6378000, distanceMultiplier:6378000});
  • 耗时:0.001s
  • explain:使用索引
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/503959
推荐阅读
相关标签
  

闽ICP备14008679号