一、MySql不使用空间函数,简单版

1.粗算,根据场景得到一个range,计算经纬度,得到的是一个矩形区域(A),不精确,但是已经有范围这个雏形了,最容易实现的方式之一。

2.使用PHP函数计算出距离,排序即可。

排序的话,自己灵活实现。很多语言都有封装排序算法,效率也挺高的。

二、Mysql不使用空间函数,优化版

这里的优化是对(一)中range的优化。根据范围半径,计算出经纬度的变化范围,得到一个比较准确的range,这里的范围(B)是圆形的(因为$radius是俩点间的距离)。

但是筛选时候的范围(C)是矩形,所以精确上来说, 圆B是矩形C的内切圆,不在圆B但是在矩形C中的点也会出现在我们的SQL结果中。但是已经比(一)要好很多了。

我见过把这个计算带入到SQL中的,一大串SQL,这种计算本来就不是SQL该有的,不推荐这样做。

三、MySql使用空间函数

在(二)中,我们得到了4个点。这个就是矩形范围,我们只要判断是否在这个矩形内就好了。其实用到mysql的空间函数可以支持任意多边形。

还支持索引优化,注意myisam才能建立空间索引。

优化程序将调查可用的空间索引是否能包含在使用某些函数的查询搜索中,如WHERE子句中的MBRContains()或MBRWithin()函数。

--19.6.2. 使用空间索引

这里的核心思想就是用一个范围判断某个点是否在这个范围内。

在数据库有一个类型为geometry的列g。

即可准确筛选出在这个范围内的点。即使后面跟ORDER BY限制距离性能也没有太大影响。

1:从geom表中根据俩点间的距离公式计算结果,命名为distance

2:条件1,g列中的点和算出来的范围相交!相交!相交!注意我用的是MBRIntersects(),不是MBRContains()

3:条件2,distance小于给定的半径radius

4:根据distance排序

上面是根据官方文档写的示例代码,比较重要,如果你没看懂,没关系,我来举个栗子

这里选用MBRContains()来举例子,你可以自己实验下MBRWithin()函数,注意参数顺序就好了,我这里得到的结果是一样的。

函数用法:MBRContains(g1,g2)

函数说明:返回1或0以指明g1的最小边界矩形是否包含g2的最小边界矩形

函数已经说明了是g1是否包含g2,所以不要弄反了;这里的矩形支持任意多变形

目标点:D(1,1)

也可以是范围哟,见注释*1

范围:E(0 0,0 3,3 3,3 0,0 0),闭合矩形,其实支持任意闭合多边形

1:这里的目标点D也支持任意多边形,参数不再是Point()而是Polygon()

这条SQL可以解释为判断点D是否在范围内E。

1:因为g列是geometry类型的,所以要用AsText转换下再展现出来

这条SQL可以解释为列出数据库中所有包含在范围E中的点。

更多相交、包含、接触等方法见上面开发文档 《19.5.5. 关于几何最小边界矩形(MBR)的关系》

四、geohash

这个GeoHash是将二维的经纬度转换成字符串,字符串长度越长,精度就越精细。俩个字符串长度匹配的位数越多,就越接近,绝大部分情况看起来是这个样子的,但有例外。

类似于:|J 我|K |

因为GeoHash是将区域划分为一个个规则矩形,所以在同一个矩形中,GeoHash是一样的,但是会出现一个边际问题:G、H俩个左右相邻的矩形,我在G的右边际处(右边际和H相邻),餐厅J在G的左边际,餐厅K也在H的左边际,通过GeoHash得出来的结果是餐厅J离我更近,显然不合理。

可以通过加大矩形区域的精细程度和扩大相似范围解决。

根据匹配相应的位数,在mysql加入索引,可以极大提高效率。GeoHash和经纬度的转换,网上都有现成的代码,这里不再展示,PHP还有对应的C拓展能提高计算速度。

*在纬度相等的情况下:

*经度每隔0.00001度,距离相差约1米;

*每隔0.0001度,距离相差约10米;

*每隔0.001度,距离相差约100米;

*每隔0.01度,距离相差约1000米;

*每隔0.1度,距离相差约10000米。

*在经度相等的情况下:

*纬度每隔0.00001度,距离相差约1.1米;

*每隔0.0001度,距离相差约11米;

*每隔0.001度,距离相差约111米;

*每隔0.01度,距离相差约1113米;

*每隔0.1度,距离相差约11132米。

Geohash,如果geohash的位数是6位数的时候,大概为附近1千米。

五、Redis GeoHash

Redis也能玩定位?

sure!并且效率奇高!

虽然也是通过GeoHash(高性能、高精度版)来实现的,但是它封装了很多有用的方法,直接使用经纬度即可操作,能直接根据距离返回对应的点,支持直接返回json,还支持排序输出。

毕竟是Redis,持久化和容量都是要考虑的问题。

但是Redis从来不是孤军奋战的工具。

可以和MySql搭配,放在数据库前扛着,里面存储高频定位点,MySql也支持定位(方案三),合理使用应该很好的MySql定位解决方案了。

以上就是根据现有资料整理的MySql经纬度经纬解决方案,如果有更好的方案,欢迎评论区讨论。

本文由程小白创作,本文可自由转载、引用,但需署名作者且注明文章出处。

mysql 经纬度 索引_转:mysql根据经纬度查找排序相关推荐

  1. mysql memory 索引_理解MySQL——索引与优化

    索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将对整个表进 ...

  2. 数据库mysql建立索引_为mysql数据库建立索引

    前些时候,一位颇高级的程序员居然问我什么叫做索引,令我感到十分的惊奇,我想这绝不会是沧海一粟,因为有成千上万的开发者(可能大部分是使用MySQL的)都没有受过有关数据库的正规培训,尽管他们都为客户做过 ...

  3. mysql in 索引_关于MySQL种的in函数到底走不走索引、我和同事差点大打出手!

    " 我是小羊同学,一个兢兢业业的程序员" 背景:有一天同事突然问我为什么加了in查询就突然变慢了.小羊脱口而出:"in不走索引!" 于是就炸开了锅:in不走索引 ...

  4. MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结

    MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结 一.VARCHAR存储和行长度限制 1.VARCHAR(N)中,N指的是字符的长度,VARCHAR类型最大支持65535,指的是 ...

  5. mysql geometry 维度_使用MySQL的geometry类型处理经纬度距离问题的方法

    建表 CREATE TABLE `map` ( `id` int(11) NOT NULL, `address` varchar(255) NOT NULL DEFAULT '', `location ...

  6. mysql5.6 函数索引_聊聊MySQL中的索引

    关于MySQL中的索引使用 索引是数据库优化中最常用也是最重要的手段之一,通过索引通常可以帮助用户解决大多数的SQL性能问题. 索引的存储分类: 1.B-Tree索引:最常见的索引类型,大部分引擎都支 ...

  7. mysql为什么使用b 树作为索引_为什么Mysql用B+树作为索引

    该篇文章已经投稿给公众号hollis 1.什么是索引 索引这个词,相信大多数人已经相当熟悉了.不过为了文章的完整性,这里再啰嗦一下.索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的 ...

  8. 覆盖索引与联合索引_浅析MySQL的索引覆盖和索引下推

    写在前面 在MySQL数据库中,索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点,索引就是为了提高数据查询的效率.今天我们来聊聊在MySQL索引优化中两种常见的方式,索引覆盖和 ...

  9. mysql 虚拟列索引_使用MySQL 5.7虚拟列提高查询效率

    原标题:使用MySQL 5.7虚拟列提高查询效率 导读 翻译团队:星耀队@知数堂 团队成员:星耀队-芬达,星耀队-顺子,星耀队-M哥 原文出处:https://www.percona.com/blog ...

  10. mysql 唯一索引_面试官:谈谈你对mysql索引的认识?

    引言 大家好,我渣渣烟.我曾经写过一篇<面试官:讲讲mysql表设计要注意啥>,当时写完后,似乎效果还行! 于是呢,决定再来一个mysql的数据库专题,这篇我们就来谈谈关于索引方面的mys ...

最新文章

  1. 飞桨框架2.0正式版重磅发布,一次端到端的“基础设施”革新
  2. 如何将原图和json融合_图像语义分割出的json文件和原图,用plt绘制图像mask
  3. 云管边端架构图_中移物联网布局构建“云-管-端”全方位体系架构
  4. 关于人脸识别最近浏览器打不开摄像头的解决方案
  5. JS-封装js让一个div或者img的移动
  6. linux opencl(AMD) Example
  7. (pytorch-深度学习系列)pytorch实现多层感知机(手动定义模型)对Fashion-MNIST数据集进行分类-学习笔记
  8. windows installer没有正确安装_电脑还可以这样禁止软件自动安装,后悔知道得太晚...
  9. 利用NLB建立双机负载均衡群集
  10. Android-Window(一)——初识Window
  11. 使用nssm管理Windows服务
  12. Excel远程连接Oracle,excel连接数据库_怎么用oracle命令连接远程数据库�9�3
  13. vscode运行c语言
  14. VBA解压压缩文件。
  15. 数电课程设计数字钟c语言编程,数电数字钟设计,含源码
  16. Delphi下实现全屏快速找图找色 四、BitmapData.pas的使用
  17. Java多线程篇--线程的等待通知
  18. 怎么样配置阿里云的CDN-可以加速网站访问速度
  19. 【树的算法】之求分割木板最小开销
  20. 基于yolov5与改进VGGNet的车辆多标签实时识别算法

热门文章

  1. 速卖通尺寸表 html源码,最新!速卖通尺码表功能上线
  2. 正确使用 CDN 让你更好规避安全风险
  3. 轻量级 android模拟器,【分享中控】轻量级中控系统
  4. oracle ogg checkpoint,OGG目的端的checkpoint table被drop的修复方法
  5. 织梦Dedecms忘记管理员后台密码解决办法
  6. Sizes of tensors must match except in dimension 1. Got 85 and 6 in dimension 2
  7. Win10应用商店和UWP应用无法连接网络解决方法
  8. 科学与财富杂志科学与财富杂志社科学与财富编辑部2022年第27期目录
  9. 新浪微博平台的多级架构
  10. ES3、ES5、ES6继承