目前越来越多的业务都会基于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函数相关推荐

  1. mysql geo_地理位置geo处理之mysql函数的详细介绍(附代码)

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

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

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

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

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

  4. Mysql学习总结(5)——MySql常用函数大全讲解

    MySQL数据库中提供了很丰富的函数.MySQL函数包括数学函数.字符串函数.日期和时间函数.条件判断函数.系统信息函数.加密函数.格式化函数等.通过这些函数,可以简化用户的操作.例如,字符串连接函数 ...

  5. MySQL学习笔记_7_MySQL常用内置函数

    MySQL常用内置函数 说明: 1)可以用在SELECT/UPDATE/DELETE中,及where,orderby,having中 2)在函数里将字段名作为参数,变量的值就是字段所对应的每一行的值. ...

  6. mysql from_unixtime_MySQL 数据库中日期与时间函数 FROM_UNIXTIME(), UNIX_TIME() ...

    这几天写代码,反复用到将日期时间字段转化成数字串和日期格式字符串的情况,感觉自己还处于壹知半解之中,索性花点时间查下相关资料,基本弄明白了 MySQL 中两个常用的日期函数的用法,记录于此,作为笔记供 ...

  7. mysql字符串逆时针旋转180度_mysql 函数示例(转)

    ord(str) 如果字符串str句首是单字节返回与ascii()函数返回的相同值. 如果是一个多字节字符,以格式返回((first byte ascii code)*256+(second byte ...

  8. 超详细图解!【MySQL进阶篇】存储过程,视图,索引,函数,触发器

    超详细图解![MySQL进阶篇]存储过程,视图,索引,函数,触发器 1.1 下载Linux 安装包 1.2 安装MySQL 1.3 启动 MySQL 服务 1.4 登录MySQL 2\. 索引 2.1 ...

  9. 在MySQL的InnoDB存储引擎中count(*)函数的优化

    转载自  在MySQL的InnoDB存储引擎中count(*)函数的优化 写这篇文章之前已经看过了很多数据库方面的优化内容,大部分都是加索引.使用事务.要什么select什么等等.然而,只是停留在阅读 ...

最新文章

  1. OpenCV安装 问题总结以及相关注意事项
  2. 防止接口数据出问题,前端假数据调试
  3. JavaEE 设计模式
  4. apache hive_通过6个简单的步骤在Windows上运行Apache Hive
  5. ClickedOnce部署方法
  6. 在正式使用计算机账务系统的银行对账功能,用友ERP-U8管理系统认证考试理论题...
  7. Gradle 3.0.0设置Apk文件输出命名
  8. 数据挖掘:数据清洗——异常值处理
  9. Autodesk正在招聘Civil、Infraworks金牌支持工程师(Premium Support Specialist)
  10. highcharts 时间少8小时问题
  11. Office基础操作:Word插入visio图片显示不全
  12. 异速联某客户端无法登陆
  13. Python常用标准库、模块
  14. photoshop制作透明背景图片1
  15. 一套键鼠控制多台不同平台电脑——synergy使用详解
  16. linux ubuntu 播放csf格式视频解决方案
  17. URP SMAA 细品
  18. 内网入口——代理搭建端口转发
  19. 哈尔滨工程大学学生郭天祥六年非一般的大学
  20. 计算机应用基础实验报告心得体会,计算机应用基础实训总结报告

热门文章

  1. html内嵌框架怎么写,在HTML网页中,内嵌框架的标签代码是()。
  2. 【树形结构】巴基斯坦城市列表 (城市原始数据来自md文件)
  3. 高新技术企业申请流程如何
  4. 7-25朋友圈(C语言版)
  5. 最常见的几种排序算法原理和C#实现类库
  6. 二叉树系列(1)-实现排序二叉树
  7. 基础知识回顾——迭代器和生成器
  8. WS小世界网络构建实验(Matlab版)
  9. 用Mouse_event()来模拟鼠标操作
  10. 【cocos2dx 3.10】android studio真机调试的配置