本篇文章给大家带来的内容是关于地理位置geo处理之mysql函数的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

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

目前已知解决方案有:mysql 自定义函数计算mysql geo索引mongodb geo索引postgresql PostGis索引redis geoElasticSearch

本文测试下mysql 函数运算的性能

准备工作

创建数据表CREATE TABLE `driver` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

`lng` float DEFAULT NULL,

`lat` float DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

创建测试数据

在创建数据之前先了解下基本的地理知识:全球经纬度的取值范围为: 纬度-90~90,经度-180~180

中国的经纬度范围大约为: 纬度3.86~53.55,经度73.66~135.05

北京行政中心的纬度为39.92,经度为116.46

越北面的地方纬度数值越大,越东面的地方经度数值越大

度分转换: 将度分单位数据转换为度单位数据,公式:度=度+分/60

分秒转换: 将度分秒单位数据转换为度单位数据,公式:度 = 度 + 分 / 60 + 秒 / 60 / 60

在纬度相等的情况下:经度每隔0.00001度,距离相差约1米

在经度相等的情况下:纬度每隔0.00001度,距离相差约1.1米

mysql函数计算DELIMITER //

CREATE DEFINER=`root`@`localhost` FUNCTION `getDistance`(

`lng1` float(10,7)

,

`lat1` float(10,7)

,

`lng2` float(10,7)

,

`lat2` float(10,7)

) RETURNS double

COMMENT '计算2坐标点距离'

BEGIN

declare d double;

declare radius int;

set radius = 6371000; #假设地球为正球形,直径为6371000米

set d = (2*ATAN2(SQRT(SIN((lat1-lat2)*PI()/180/2)

*SIN((lat1-lat2)*PI()/180/2)+

COS(lat2*PI()/180)*COS(lat1*PI()/180)

*SIN((lng1-lng2)*PI()/180/2)

*SIN((lng1-lng2)*PI()/180/2)),

SQRT(1-SIN((lat1-lat2)*PI()/180/2)

*SIN((lat1-lat2)*PI()/180/2)

+COS(lat2*PI()/180)*COS(lat1*PI()/180)

*SIN((lng1-lng2)*PI()/180/2)

*SIN((lng1-lng2)*PI()/180/2))))*radius;

return d;

END//

DELIMITER ;

创建数据python脚本# coding=utf-8

from orator import DatabaseManager, Model

import logging

import random

import threading

""" 中国的经纬度范围 纬度3.86~53.55,经度73.66~135.05。大概0.00001度差距1米 """

# 创建 日志 对象

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 database

config = {

'mysql': {

'driver': 'mysql',

'host': 'localhost',

'database': 'dbtest',

'user': 'root',

'password': '',

'prefix': ''

}

}

db = DatabaseManager(config)

Model.set_connection_resolver(db)

class Driver(Model):

__table__ = 'driver'

__timestamps__ = False

pass

def ins_driver(thread_name,nums):

logger.info('开启线程%s' % thread_name)

for _ in range(nums):

lng = '%.5f' % random.uniform(73.66, 135.05)

lat = '%.5f' % random.uniform(3.86, 53.55)

driver = Driver()

driver.lng = lng

driver.lat = lat

driver.save()

thread_nums = 10

for i in range(thread_nums):

t = threading.Thread(target=ins_driver, args=(i, 400000))

t.start()

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

测试测试环境

系统:mac os

内存:16G

cpu: intel core i5

硬盘: 500g 固态硬盘

测试下查找距离(134.38753,18.56734)这个坐标点最近的10个司机select *,`getDistance`(134.38753,18.56734,`lng`,`lat`) as dis from driver ORDER BY dis limit 10耗时:18.0s

explain:全表扫描

我测试了从1万到10万间隔1万和从10万到90万每间隔10万测试的结果变化

结论此方案在数据量达到3万条查询耗时就会超过1秒

大约每增加1万条就会增加0.4秒的耗时

mysql geo_地理位置geo处理之mysql函数的详细介绍(附代码)相关推荐

  1. mysql geo_地理位置geo处理之mysql函数

    目前越来越多的业务都会基于LBS,附近的人,外卖位置,附近商家等等,现就讨论离我最近这一业务场景的解决方案. 原文:https://www.jianshu.com/p/455d0468f6d4 目前已 ...

  2. np.empty()函数、np.random.uniform()函数、np.random.normal()函数的详细介绍和代码说明

    目录 np.empty()函数 np.random.uniform()函数 np.random.normal()函数 np.random的其它常见函数 参考 np.empty()函数 函数定义: nu ...

  3. mysql geo 函数_【后端开发】地理位置geo处理之mysql函数的详细介绍(附代码)

    本篇文章给大家带来的内容是关于地理位置geo处理之mysql函数的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 目前越来越多的业务都会基于LBS,附近的人,外卖位 ...

  4. python中get函数是什么意思_详解python中get函数的用法(附代码)_后端开发

    strncmp函数用法详解_后端开发 strncmp函数为字符串比较函数,其函数语法为"int strncmp ( const char * str1, const char * str2, ...

  5. linux下的fgetc()与fputc()函数详细介绍及代码演示

    linux下的标准I/O的fgetc()与fputc()函数详细介绍及代码演示 文章目录 前言 一.fgetc()用法介绍 二.fputc()用法介绍 代码演示 总结 前言 在C语言中,读写文件比较灵 ...

  6. python中字符串函数的用法_python中字符串内置函数的用法介绍(代码)

    本篇文章给大家带来的内容是关于python中字符串内置函数的用法介绍(代码) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. capitalize() 首字母大写a='somewor ...

  7. js接收php 回调,JS callback回调函数的使用(附代码)

    这次给大家带来JS callback回调函数的使用(附代码),JS callback回调函数使用的注意事项有哪些,下面就是实战案例,一起来看一下. 在使用开源项目的时候经常会使用到回调函数,如果把回调 ...

  8. mysql geo 函数_地理位置geo处理之mysql函数

    目前越来越多的业务都会基于LBS,附近的人,外卖位置,附近商家等等,现就讨论离我最近这一业务场景的解决方案. 原文:https://www.jianshu.com/p/455d0468f6d4 目前已 ...

  9. MySQL数据库的锁 --- 六种分类 - 14种锁详细介绍

    MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一个资源的机制,在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性 ...

最新文章

  1. AI综述专栏 | 神经科学启发的人工智能
  2. java 之 异常
  3. DayDayUp之Job:牛客网—算法工程师—剑指offer之66道在线编程(解决思路及其代码)——21~40
  4. angular路由传递参数_在angular4.0路由传递获取参数的最优方案
  5. 嵌入式开发中模拟SPI的驱动
  6. 图论 —— AOE 网与关键路径
  7. 石头剪刀布程序流程图_“剪刀、石头、布”也能救命?临安区社会福利中心开展海姆立克急救法培训...
  8. oracle 设置忽略关键字,记oracle里continue关键字的陷阱
  9. php navigator,微信小程序组件:navigator页面链接解读和分析
  10. 学linux做笔记本,linux学习之笔记本安装CentOS7
  11. 统计局:去年12月天然气、电力生产增长较快
  12. 经典机器学习系列(七)【聚类分析】
  13. 微信小程序测试号申请页面不显示AppID 和AppSecret的解决办法
  14. C语言入门实战(11):输入一组正整数,求逆序数的和
  15. R:员工离职预测实战
  16. html5页面上下翻页特效,h5实现垂直上下翻页效果
  17. Vm linux虚拟机与本地宿主机互通
  18. python爬虫:爬取全国航班信息
  19. 千万同时在线直播聊天室架构演进
  20. 骞云再获阿里云产品生态集成认证,携手共建云原生管理新生态

热门文章

  1. html右侧导航栏固定,固定导航栏.html
  2. 【推荐】比IPH5更爱疯的G5
  3. unity导入的模型设置详谈(后面动作)
  4. java的框架是干嘛的_spring框架是干什么的
  5. 360极速浏览器下载地址
  6. 根据学生分数给学生成绩分等级
  7. linux命令执行进度显示工具progress
  8. 100%代码覆盖率神话
  9. C# 中实现注册表的写入和读取
  10. 消息代理 - RabbitMQ - 学习/实践