sql语句查询经纬度范围

指定一个经纬度,给定一个范围值(单位:千米),查出在经纬度周围这个范围内的数据。

经度:113.914619

纬度:22.50128

范围:2km

longitude为数据表经度字段

latitude为数据表纬度字段

SQL在mysql下测试通过,其他数据库可能需要修改

SQL语句如下:

select * from location where sqrt( ( ((113.914619-longitude)*PI()*12656*cos(((22.50128+latitude)/2)*PI()/180)/180) * ((113.914619-longitude)*PI()*12656*cos (((22.50128+latitude)/2)*PI()/180)/180) ) + ( ((22.50128-latitude)*PI()*12656/180) * ((22.50128-latitude)*PI()*12656/180) ) )<2

MySQL性能调优 – 使用更为快速的算法进行距离

最近遇到了一个问题,通过不断的尝试最终将某句原本占据近1秒的查询优化到了0.01秒,效率提高了100倍.

问题是这样的,有一张存放用户居住地点经纬度信息的MySQL数据表,表结构可以简化 为:id(int),longitude(long),latitude()long. 而业务系统中有一个功能是查找离某个用户最近的其余数个用户,通过代码分析,可以确定原先的做法基本是这样的:

//需要查询的用户的坐标

$lat=20;

$lon=20;//执行查询,算出该用户与所有其他用户的距离,取出最近的10个

$sql='select * from users_location order by ACOS(SIN(('.$lat.'* 3.1415) / 180 ) *SIN((latitude * 3.1415) / 180 ) +COS(('.$lat.'* 3.1415) / 180 ) * COS((latitude * 3.1415) / 180 ) *COS(('.$lon.'* 3.1415) / 180 - (longitude * 3.1415) / 180 ) ) * 6380 asc limit 10';

而这条sql执行的速度却非常缓慢,用了近1秒的时间才返回结果,应该是因为order里的子语句用了太多的数学计算公式,导致整体的运算速度下降.

而在实际的使用中,不太可能会发生需要计算该用户与所有其他用户的距离,然后再排序的情况,当用户数量达到一个级别时,就可以在一个较小的范围里进行搜索,而非在所有用户中进行搜索.

所以对于这个例子,我增加了4个where条件,只对于经度和纬度大于或小于该用户1度(111公里)范围内的用户进行距离计算,同时对数据表中的经度和纬度两个列增加了索引来优化where语句执行时的速度.

最终的sql语句如下

$sql='select * from users_location where

latitude >'.$lat.'-1 and

latitude

longitude >'.$lon.'-1 and

longitude

order by ACOS(SIN(('.$lat.'* 3.1415) / 180 ) *SIN((latitude * 3.1415) / 180 ) +COS(('.$lat.'* 3.1415) / 180 ) * COS((latitude * 3.1415) / 180 ) *COS(('.$lon.'* 3.1415) / 180 - (longitude * 3.1415) / 180 ) ) * 6380 asc limit 10';

经过优化的sql大大提高了运行速度,在某些情况下甚至有100倍的提升.这种从业务角度出发,缩小sql查询范围的方法也可以适用在其他地方.

oracle查询坐标在范围之内,lbs中从库中查询某经纬度2KM范围内的数据相关推荐

  1. oracle urlencode 中文,Python2和Python3中urllib库中urlencode的使用注意事项

    前言 在Python中,我们通常使用urllib中的urlencode方法将字典编码,用于提交数据给url等操作,但是在Python2和Python3中urllib模块中所提供的urlencode的包 ...

  2. python3 urlencode_Python2和Python3中urllib库中urlencode的使用注意事项

    前言 在Python中,我们通常使用urllib中的urlencode方法将字典编码,用于提交数据给url等操作,但是在Python2和Python3中urllib模块中所提供的urlencode的包 ...

  3. Allegro中封装库中的封装更新到PCB中出现焊盘中心错位

    Allegro中封装库中的封装更新到PCB中出现焊盘中心错位 今天在画一个板子的时候,直接复制的上一个工程的LIB,在导入原理图网表更新后,焊盘中心出现错位. 使用的是一个锅仔片的封装,出现错误如下图 ...

  4. Oracle Dataguard中备库中归档日志不同步

    环境:RAC+单机 Dataguard 问题:启动备库到ADG模式时,发现后台归档日志并不同步 1.在备库中发现日志的归档日志不同步,内容如下: MRP0: Background Media Reco ...

  5. C++11 中STL库中新增内容

    C++ 11一个比较显著的变化是以前boost库中的一些函数被正式标准化合入到STL中了,本文就简单的介绍一下. 引用包装器(Reference Wrapper) 当模板函数参数为泛型类型的时候,无法 ...

  6. 关于Python中turtle库中简单函数的解释

    turtle库中简单绘制函数 关于窗口 turtle.setup(width,height,startx,starty)** 用于设置绘图窗口的位置,width为窗口的长,height为窗口的宽,st ...

  7. Delphi中多库关联查询

    在我们对数据库进行操作时,经常用到TTable控件,但TTable只能同时对一个数据表进行操作,而TQuery控件不仅具有TTable的多数功能,而且同时可对多个数据表进行操作.不仅如此,TQuery ...

  8. opencv中imgproc库中函数详解(1)

    BaseColumnFilter 单列核的基础滤波器. [cpp] view plaincopy class BaseColumnFilter { public: virtual ~BaseColum ...

  9. Python中MNE库的事件相关特定频段分析(MEG数据)

    最近做运动想象分类的时候遇到一个问题就是分类结果始终不准,想从原始数据分析一下脑电数据,找了下MNE提供的examples.里面还真有一个按频带分析的例子,说实话打开这个例子最主要的原因是这个图看着比 ...

最新文章

  1. 【Python】常用包整理,包括Numpy、Pandas、sklearn、url、pymysql、Wxpy、Xlwt、Pyecharts等
  2. 使用SQL Server 2008 Extended Events SSMS Addin轻松管理XEvents
  3. 单词拆分—leetcode139
  4. 一个html5流星雨源码
  5. 利用JTDS连接数据库并操作示例
  6. 设计psd分层素材模板|家居海报设计思路!
  7. nginx(三)status状态页面的相关信息及配置,以及nginx的访问控制配置
  8. Flutter 使用Dart Format格式化代码
  9. 酒店小程序线上营销解决方案-思途智旅
  10. 如何把word默认新建文档的格式样式更改为常用的格式样式呢
  11. MATLAB - 线型、Marker点等属性的设置
  12. @property的用法
  13. mysql simpleconsumer_SimpleMessageListenerContainer:Consumer raised exception
  14. 威联通使用 HP 1020 Plus 打印机
  15. 计算机的随想作文600字,随想作文600字
  16. 5分钟带你看懂区块链浏览器
  17. 各大互联网大厂年终奖一览表,又是别人家的公司!
  18. fputc函数重写实现printf重定向
  19. 辰视智能携手大族机器人亮相深圳工业展暨22届SIMM深圳机械展
  20. Ubuntu 20.04 安装微信(亲测)

热门文章

  1. Java环境搭建细则
  2. 约吗?有料有趣的物联网大会
  3. nvivo怎么处理访谈记录_Java自然语言处理-第二版:书评和访谈
  4. 厦门大学 数据库实验室(林子雨)
  5. mall4j的小程序商城(java)
  6. Qt文件QFile 和文件夹QDir
  7. Vue+Cesium创建项目并加载地图全过程
  8. linux ab压力测试
  9. 2.6 第十讲 二阶微分方程的计算
  10. python必备源代码-Python 自用代码(某方标准类网页源代码清洗)