`
kerlubasola
  • 浏览: 709676 次
文章分类
社区版块
存档分类
最新评论

LBS中从数据库查询某经纬度2KM范围内的数据 - 针对大数据量的性能优化

 
阅读更多

之前很啥很天真地以为无非就是逐个计算距离,然后比较出来就行了,然后当碰到访问用户很多,而且数据库中经纬度信息很多的时候,计算量的迅速增长,能让服务器完全傻逼掉,还是老前辈的经验比我们丰富,给了我很大的启示。


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 < '.$lat.'+1 and
longitude > '.$lon.'-1 and
longitude < '.$lon.'+1
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查询范围的方法也可以适用在其他地方.


原文地址: http://www.scourgen.com/mysql_performance_optimize-using_a_better_way_to_compute_users_distinct

分享到:
评论

相关推荐

    全国基站lbs定位库 基站定位 lbs定位数据库

    全国基站LBS定位库是一个重要的数据资源,它包含了中国移动、中国联通和中国电信全网的基站位置信息,总计84万条数据。LBS,即Location Based Services,基于位置的服务,是利用移动通信网络和卫星定位系统(如GPS)...

    LBS 经纬度

    LBS ,定位方式,通过经纬度来确定省市区,此文档提供了全国给个省份区的经纬度。

    最新全国基站lbs定位库 基站定位 lbs定位数据库

    最新全国基站lbs定位库包含全国移动联通电信全网lbs位置数据

    百度地图Api Get获取LBS数据及经纬度转换

    百度地图Api开发源码,包括地图初始化,百度地图和GPS坐标之间的转换,以及通过GET请求获取云端的详细数据,添加自定义图层并自定义点击标签事件

    省市区街道四级数据(含经纬度)

    1.包括省、市、区、镇/街道四级 2.包括经纬度信息 3.拉取数据截至2023年7月 4.数据来源:高德API=&gt;https://lbs.amap.com/api/webservice/guide/api/district

    免费全国移动联通电信基站数据库,基站查询

    基站数据库是通信行业中至关重要的资源,它包含了全国范围内所有移动、联通和电信运营商的基站信息。这个免费的全国移动联通电信基站数据库提供了丰富的数据,帮助用户进行基站查询和分析。以下将详细介绍基站、基站...

    中国各城市经纬度数据

    从给定的文件信息来看,我们正在处理的是中国各城市的经纬度数据,这是一份非常重要的地理信息资源,对于地图绘制、地理位置定位、导航系统、地理信息系统(GIS)开发以及各种基于位置的服务(LBS)都有着不可替代的...

    中国省市县三级政府驻地详细数据(含经纬度)

    中国省市县三级政府驻地详细数据(含经纬度),省市县行政区由高德开发者中心获取,通过兴趣点查询接口,爬取经纬度等详细信息,整理成excel表,供行政区驻地配图等场景使用。 2、字段信息: typecode 省市县类型 ...

    Java实现根据地址调用高德地图获取经纬度等信息

    最近在做一个车辆调度的应用系统,需要根据车辆和站点的位置做相应的规划,因此要调用第三方的地图接口来获取经纬度等信息。这里,我选择的是高德平台,下面是一个从注册到简单使用的例子,可供大家学习参考,更深入...

    根据当前坐标(经纬度)计算附近位置-java版本

    主要涉及日常需要解决问题,例如类似于滴滴打车实现查找附近车辆业务逻辑和贝壳找房根据指定位置筛选出附近房源,上述两场场景应用可借鉴代码中两种方法予以解决,当然如果技术允许可以参照使用mongoDb数据库,内置...

    传智播客iOS6免费公开课程-LBS经纬度定位

    在iOS开发中,LBS(Location-Based Services,基于位置的服务)是移动应用中不可或缺的一部分,它利用设备的GPS(全球定位系统)、Wi-Fi、蜂窝数据等技术来获取用户的位置信息,进而提供各种与地理位置相关的服务,...

    两经纬度之间的距离

    在实际应用中,如果需要找出距离某中心点N范围内的所有经纬度点,可以遍历所有点,对每个点调用这个函数,判断结果是否小于给定的半径N,如果是,则将该点添加到结果列表中。 例如,假设我们有一个包含多个经纬度点...

    中国省市边界经纬度地图,json格式

    本文将介绍一个在实际应用中已被验证的资源——一份全面的中国省市边界经纬度地图,以json格式呈现,为中国地图数据的处理和分析提供了便利。 该数据集以JSON格式存储,JSON作为一种通用的数据格式,具有良好的跨...

    全国基站lbs定位库包含全国移动联通电信全网lbs位置数据,94万条

    全国基站lbs定位库包含全国移动联通电信全网lbs位置数据,94万条

    LBS空间搜索架构的优化历程.1c18c6f0-7e53-11e6-831e-83ec0cef607e.pdf

    MongoDB在处理大量骑手坐标上报时,由于其库级锁机制,导致从服务器CPU负载升高,查询性能和吞吐量降低,主从复制延迟增加。为解决这些问题,可以考虑升级到支持行级锁的MongoDB版本(如2.8+)并进行分片,以提高...

    LBS GPS定位用户地理位置(经纬度)实例.rar

    本例是用来获取用户地理位置信息中的经纬度,不过要完全正常运行本实例需要以下条件: 1. 一部 iphone (iOS3.0 ) 或 android (2.0 ) 的手机 2. 浏览器 Chrome 5 , Firefox 3.6 , Opera 10.6, Safari 5, IE 9

    含经纬度,拼音,70多万条 全国各省、市、县、镇、村数据库,详细到居委会的数据

    全国各省、市、县、镇、村、街道、居委会数据库,数据来源于国家统计局,70多万数据,MySQL 格式。 每一条都含经纬度,拼音,地址,上下级关系,非常适合LBS应用开发。 1、起因: 由于市面上的城市数据不是量太少...

    JS实现根据详细地址获取经纬度功能示例

    - 整个代码在用户输入地址并点击查询按钮后执行,完成从地址到经纬度的查询,并在地图上以标记的方式展示位置,同时在用户界面上显示经纬度信息。 通过以上知识点,开发者可以了解如何使用JavaScript和百度地图API...

    滴滴LBS系统架构实践

    - **高性能查询**:通过优化索引结构和支持并行查询等方式,实现在10毫秒内完成上万个位置查询的能力。 ##### 四、地理位置编码服务 - **编码机制**:介绍Geohash算法的基本原理和应用场景。 - **索引结构**:使用R...

    LBS云储存DEMO

    LBS云存储是基于云计算平台的一种服务,它专门针对地理位置数据的特性进行优化,可以处理大量的经纬度坐标、地理围栏、轨迹等信息。这种服务通常包括数据存储、数据检索、数据分析等功能,同时支持实时更新和查询,...

Global site tag (gtag.js) - Google Analytics