我们在工作中做类似的事情。
我们每小时收到大约 100 万次查询,当我们使用空间索引时,它基本上会关闭数据库并且查询会进入挂起状态。一些查询等待了大约8,000
几秒钟(大约 2 小时)。所以我们必须找到另一种方法,这是我们能想到的最好的方法,它现在不再备份数据库,并以毫秒为单位返回结果。
我们要做的是首先我们有一个距离函数,如下所示:
CREATE FUNCTION `distance`(`lat1` DECIMAL(10,7), `lon1` DECIMAL(10,7), `lat2` DECIMAL(10,7), `lon2` DECIMAL(10,7)) RETURNS double
BEGIN
DECLARE X DOUBLE;
DECLARE PI DECIMAL(21, 20);
SET PI = 3.14159265358979323846;
SET X = SIN(lat1 * PI / 180)
* SIN(lat2 * PI / 180)
+ COS(lat1 * PI / 180)
* COS(lat2 * PI / 180)
* COS((lon2 * PI / 180) - (lon1 * PI / 180));
SET X = ATAN((SQRT( 1- POWER( X, 2))) / X);
RETURN (1.852 * 60.0 * ((X / PI) * 180)) / 1.609344;
END
在返回线上移除/ 1.609344
以获取公里数
然后,我们有一个程序来计算您的位置与周围区域之间的距离。从我们测试的结果来看,这是最快的(我们所拥有的简化版本):
CREATE PROCEDURE `MyRadius`(IN `p_lat` DOUBLE, IN `p_long` DOUBLE, IN `radius` INT)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
SELECT distance(p_lat, p_long, g.latitude, g.longitude) as distance, country, region, city
from geocity g
having distance <= radius
order by distance asc limit 100;
END
您可能想要更改order
条款,因为我不确定您要如何订购它。