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
- MYSQL附近的人设计思路
- 附近的人,实现思路
- mysql查找附近优化思路
- Mysql的设计思路
- 附近的人计算方法-----使用mysql脚本计算方法
- LBS 附近的人
- 附近的人功能
- php附近的人
- java 附近的人
- PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法,即附近的人
- mysql php 数据库查询附近的好友
- 使用 MySQL 查找附近的位置
- “附近的人”功能实现
- 与附近的人聊天、
- Mongodb获取附近的人
- 查询附近的人SQL
- Elasticsearch搜索附近的人
- 被人误解的设计思路1
- maven里如何根据不同的environment打包
- 每个程序员都应注意的9种反面模式
- 光流(三)--LK算法改进(金字塔LK)
- Android 第一章
- android 判断 手机号码、邮编、Email邮箱、是否正确
- MYSQL附近的人设计思路
- Binary Tree Paths
- 什么工具可以恢复Excel文档的打开密码
- 二维数组中的查找 C++
- php:similar_text()函数的相关解析
- C语言调用WindowAPI对注册表操作
- JavaScript 数组详解以及常用方法
- Qt学习之路(36): Qt容器类之遍历器和隐式数据共享
- 基于AFNetworking3.0自定义block网络回调事件(GET、POST、Download)