mysql geo_地理位置geo处理之mysql函数
目前越来越多的业务都会基于LBS,附近的人,外卖位置,附近商家等等,现就讨论离我最近这一业务场景的解决方案。
原文:https://www.jianshu.com/p/455d0468f6d4
目前已知解决方案有:
mysql 自定义函数计算
mysql geo索引
mongodb geo索引
postgresql PostGis索引
redis geo
ElasticSearch
本文测试下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;
创建测试数据
在创建数据之前先了解下基本的地理知识:
全球经纬度的取值范围为: 纬度-9090,经度-180180
中国的经纬度范围大约为: 纬度3.8653.55,经度73.66135.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()
image.png
以上脚本创建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万测试的结果变化
image.png
结论
此方案在数据量达到3万条查询耗时就会超过1秒
大约每增加1万条就会增加0.4秒的耗时
mysql geo_地理位置geo处理之mysql函数相关推荐
- mysql geo_地理位置geo处理之mysql函数的详细介绍(附代码)
本篇文章给大家带来的内容是关于地理位置geo处理之mysql函数的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 目前越来越多的业务都会基于LBS,附近的人,外卖位 ...
- mysql geo 函数_【后端开发】地理位置geo处理之mysql函数的详细介绍(附代码)
本篇文章给大家带来的内容是关于地理位置geo处理之mysql函数的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 目前越来越多的业务都会基于LBS,附近的人,外卖位 ...
- mysql geo 函数_地理位置geo处理之mysql函数
目前越来越多的业务都会基于LBS,附近的人,外卖位置,附近商家等等,现就讨论离我最近这一业务场景的解决方案. 原文:https://www.jianshu.com/p/455d0468f6d4 目前已 ...
- Mysql学习总结(5)——MySql常用函数大全讲解
MySQL数据库中提供了很丰富的函数.MySQL函数包括数学函数.字符串函数.日期和时间函数.条件判断函数.系统信息函数.加密函数.格式化函数等.通过这些函数,可以简化用户的操作.例如,字符串连接函数 ...
- MySQL学习笔记_7_MySQL常用内置函数
MySQL常用内置函数 说明: 1)可以用在SELECT/UPDATE/DELETE中,及where,orderby,having中 2)在函数里将字段名作为参数,变量的值就是字段所对应的每一行的值. ...
- mysql from_unixtime_MySQL 数据库中日期与时间函数 FROM_UNIXTIME(), UNIX_TIME() ...
这几天写代码,反复用到将日期时间字段转化成数字串和日期格式字符串的情况,感觉自己还处于壹知半解之中,索性花点时间查下相关资料,基本弄明白了 MySQL 中两个常用的日期函数的用法,记录于此,作为笔记供 ...
- mysql字符串逆时针旋转180度_mysql 函数示例(转)
ord(str) 如果字符串str句首是单字节返回与ascii()函数返回的相同值. 如果是一个多字节字符,以格式返回((first byte ascii code)*256+(second byte ...
- 超详细图解!【MySQL进阶篇】存储过程,视图,索引,函数,触发器
超详细图解![MySQL进阶篇]存储过程,视图,索引,函数,触发器 1.1 下载Linux 安装包 1.2 安装MySQL 1.3 启动 MySQL 服务 1.4 登录MySQL 2\. 索引 2.1 ...
- 在MySQL的InnoDB存储引擎中count(*)函数的优化
转载自 在MySQL的InnoDB存储引擎中count(*)函数的优化 写这篇文章之前已经看过了很多数据库方面的优化内容,大部分都是加索引.使用事务.要什么select什么等等.然而,只是停留在阅读 ...
最新文章
- OpenCV安装 问题总结以及相关注意事项
- 防止接口数据出问题,前端假数据调试
- JavaEE 设计模式
- apache hive_通过6个简单的步骤在Windows上运行Apache Hive
- ClickedOnce部署方法
- 在正式使用计算机账务系统的银行对账功能,用友ERP-U8管理系统认证考试理论题...
- Gradle 3.0.0设置Apk文件输出命名
- 数据挖掘:数据清洗——异常值处理
- Autodesk正在招聘Civil、Infraworks金牌支持工程师(Premium Support Specialist)
- highcharts 时间少8小时问题
- Office基础操作:Word插入visio图片显示不全
- 异速联某客户端无法登陆
- Python常用标准库、模块
- photoshop制作透明背景图片1
- 一套键鼠控制多台不同平台电脑——synergy使用详解
- linux ubuntu 播放csf格式视频解决方案
- URP SMAA 细品
- 内网入口——代理搭建端口转发
- 哈尔滨工程大学学生郭天祥六年非一般的大学
- 计算机应用基础实验报告心得体会,计算机应用基础实训总结报告