Title: 地理位置geo處理之mongodb geo 索引
Date: 2017-12-01 10:34
Category: 方案
目前越來越多的業(yè)務(wù)都會基于LBS讯泣,附近的人窘疮,外賣位置乘综,附近商家等等负乡,現(xiàn)就討論離我最近這一業(yè)務(wù)場景的解決方案政己。
目前已知解決方案有:
- mysql 自定義函數(shù)計算
- mysql geo索引
- mongodb geo索引
- postgresql PostGis索引
- redis geo
- ElasticSearch
本文測試下mongodb geo索引 函數(shù)運算的性能
準備工作
創(chuàng)建數(shù)據(jù)表
db.driver.createIndex({loc: "2dsphere"})
創(chuàng)建數(shù)據(jù)python腳本
# coding=utf-8
from pymongo import MongoClient
import logging
import random
import threading
""" 中國的經(jīng)緯度范圍 緯度3.86~53.55驶睦,經(jīng)度73.66~135.05。大概0.00001度差距1米 """
# 創(chuàng)建 日志 對象
logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter(
'%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
# Connect to the mongodb database
mongoconn = MongoClient('127.0.0.1', 27017)
mdb = mongoconn.geo_analysis
driver_collection = mdb.driver
def ins_driver(thread_name, nums):
logger.info('開啟線程%s' % thread_name)
for i in range(nums):
lng = '%.5f' % random.uniform(73.66, 135.05)
lat = '%.5f' % random.uniform(3.86, 53.55)
logging.debug('插入記錄:%s' % i)
driver_collection.insert_one({
"loc":[
float(lng),
float(lat)
]
})
thread_nums = 10
for i in range(thread_nums):
t = threading.Thread(target=ins_driver, args=(i, 40000))
t.start()
以上腳本創(chuàng)建10個線程蒸播,10個線程插入4萬條數(shù)據(jù)睡榆。耗費52.43s執(zhí)行完,總共插入40萬條數(shù)據(jù)
測試
- 測試環(huán)境
系統(tǒng):mac os
內(nèi)存:16G
cpu: intel core i5
硬盤: 500g 固態(tài)硬盤
測試下查找距離(134.38753,18.56734)附近20公里的司機
db.runCommand({geoNear:'driver', near:[134.38753,18.56734], spherical:true, maxDistance:20000/6378000, distanceMultiplier:6378000});
- 耗時:0.001s
- explain:使用索引