Mysql根据经纬度查询半径多少以内的数据,画个圈圈查数据库

博客讨论了如何在MySQL中进行基于经纬度的半径范围查询,指出使用函数会导致索引失效,从而降低查询效率。作者提供了两种SQL查询方法,一种涉及函数,另一种将计算直接放入查询条件中以利用索引。对于大量数据,直接在条件中计算距离可以显著提升查询速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在地图上画个圈圈,那么就有一个点和半径,点是有经纬度的,根据经度、维度、半径到mysql数据库中去查询符合这个半径范围内的数据。

下面这个SQL是一个函数,传入两个点,返回两点的距离,通过这个函数可以带入到SQL语句中查询,可是这样有个问题,如果数据量太大,那么就用不了索引,查询会非常慢

CREATE DEFINER=`root`@`%` FUNCTION `fnGetDistance`(`longitude1` DECIMAL(18,8),`latitude1` DECIMAL(18,8),`longitude2` DECIMAL(18,8),`latitude2` DECIMAL(18,8)) RETURNS bigint(20)
BEGIN
	DECLARE Distance REAL DEFAULT 0;
        SET Distance = ROUND(6378.137*2*ASIN(SQRT(POW(SIN((latitude1*PI()/180-latitude2*PI()/180)/2),2)+COS(latitude1*PI()/180)*COS(latitude2*PI()/180)*POW(SIN((longitude1*PI()/180-longitude2*PI()/180)/2),2)))*1000);
        RETURN Distance; 
END

使用例子:由于我数据列大,非常慢,所以不采取

SELECT * FROM bg_building_price WHERE fnGetDistance(@longitude,@latitude,longitude,latitude)<=@radiu

如果要想快,只能把计算方法直接放条件上,这样就能使索引生效,不通过函数:

 SELECT * FROM bg_building_price WHERE (6378.137*2*ASIN(SQRT(POW(SIN(((@latitude-latitude)*PI()/180)/2),2)+COS(@latitude*PI()/180)*COS(latitude*PI()/180)*POW(SIN(((@longitude-longitude)*PI()/180)/2),2)))) < @radius

补充:sql语句中@符号后表示变量,填写你地图上画圈圈的经纬度和半径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值