MYSQL附近的人设计思路

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

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

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

       

DELIMITER $$
DROP FUNCTION IF EXISTS `getDistance`$$

CREATE  FUNCTION `getDistance`(lat1 double,lng1 double,lat2 double,lng2 double) RETURNS double
begin
IF(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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
设计小程序的 MySQL 表需要考虑到小程序的和需求。以下是一常见的表设计思路: . 用户表(User table):用存储用户的基本信息,例如用户、用户名、密码、邮箱、手机号码等。 2. 订单表(Order table):用于存储用户的订单信息,包括订单ID、用户ID、订单状态、订单金额、下单时间等。 3. 商品表(Product table):用于存储商品的信息,包括商品ID、商品名称、商品价格、库存数量等。 4. 购物车表(Shopping cart table):用于存储用户加入购物车的商品信息,包括购物车ID、用户ID、商品ID、数量等。 5. 收货地址表(Shipping address table):用于存储用户的收货地址信息,包括地址ID、用户ID、收件人姓名、联系电话、详细地址等。 6. 评论表(Comment table):用于存储用户对商品的评论信息,包括评论ID、用户ID、商品ID、评论内容、评分等。 7. 支付记录表(Payment record table):用于存储用户的支付记录信息,包括支付记录ID、用户ID、订单ID、支付金额、支付时间等。 8. 管理员表(Admin table):用于存储管理员的信息,例如管理员ID、用户名、密码等。 以上仅为一些基本表的设计思路,具体的表结构和字段可以根据实际需求进行调整和扩展。在设计表时,需要考虑数据的一致性、完整性和性能等方面的要求,并根据数据库的范式化原则进行设计。同时,还需要关注表之间的关联关系,使用外键等机制来确保数据的完整性和一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lynnlovemin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值