MYSQL附近的人设计思路

来源:互联网 发布:sql挂起清除 编辑:程序博客网 时间:2024/04/30 13:01

        在移动互联网广泛发展的今天,APP开发成为许多企业进入移动互联网的首选,笔者开发了众多的APP,发现很多app都有这样一个功能,那就是获取附近的人,怎么样来获取附近的人呢?其实很简单,就是要时刻记录用户的坐标(经纬度)信息到数据库中,然后根据当前用户的坐标,搜索数据库中,和当前坐标位置在 一定范围内的所有用户。

        下面笔者就给出了自己的一些思路和代码供大家参考!

        要想获得附近的人首先必须得计算出两个坐标之间的距离:

       

DELIMITER $$DROP FUNCTION IF EXISTS `getDistance`$$CREATE  FUNCTION `getDistance`(lat1 double,lng1 double,lat2 double,lng2 double) RETURNS doublebeginIF(LENGTH(lat1) =0 || LENGTH(lng1) =0 || LENGTH(lat2) =0 || LENGTH(lng2) =0 || lat1 IS NULL|| lng1 IS NULL|| lat2 IS NULL|| lng2 IS NULL) THEN      RETURN -1;    END IF;return round(6378.138*2*asin(sqrt(pow(sin( (lat1*pi()/180-lat2*pi()/180)/2),2)+cos(lat1*pi()/180)*cos(lat2*pi()/180)* pow(sin( (lng1*pi()/180-lng2*pi()/180)/2),2)))*1000);end$$DELIMITER ;

       然后开始通过SQL语句查询数据库(假设当前用户经纬度为(106,30)):

      

<pre name="code" class="sql"><pre name="code" class="sql">SELECT * FROM user u WHERE  getDistance(30,106,u.lat,u.lng) < 5000


       以上查询就能查询出5KM范围内的所有用户,当然该查询会有问题,因为此查询会全表扫描,扫描出来的每一条数据都会执行函数getDistance,对计算出来的结果再与5000比较,最后筛选出结果,试想,如果100条数据会计算100次,那么10万、100万甚至1000万条数据呢?所以下面就对该语句进行优化。

        通过笔者多年的经验得知,地球上的经纬度,没增加1°,其实物理距离是会增加的较多的,每次查询我们先筛选出1°以内的数据,再进行计算,那么计算量就会大大的缩小,请看优化后的代码:

SELECT * FROM user u WHERE u.lat - 30 < 1 AND u.lat - 30 > -1 AND u.lng - 106 < 1 AND u.lng - 106 > -1 AND  getDistance(30,106,u.lat,u.lng) < 5000

        如此就可以获得附近的人,并且效率大大的提升了,其实这还不是最优解法,大家可以自己结合自身的项目再优化一下。

1 0
原创粉丝点击