我有一个应用程序需要查询一个带有经纬度坐标的表,这些坐标是使用 MYSQL 的 POINT 数据类型存储的。
我有一个存储函数,可以在给定 GPS 位置的给定半径内查找附近的纬度和经度。但是,我的表将包含数十万个条目,因此需要优化性能。
我编写了以下存储函数,但从可能的 800,000 多行中返回大约 9,000 行需要大约 4.01 秒。有没有更好的方法来查找附近的 GPS 坐标?
这是我存储的函数:
CREATE PROCEDURE `FindNearbyPoints`(
IN RADIUS FLOAT,
IN LAT FLOAT,
IN LON FLOAT
)
BEGIN
DECLARE EARTH_RADIUS FLOAT DEFAULT 3959;
DECLARE maxLat FLOAT DEFAULT (LAT + DEGREES(RADIUS/EARTH_RADIUS));
DECLARE minLat FLOAT DEFAULT (LAT - DEGREES(RADIUS/EARTH_RADIUS));
/* compensate for degrees longitude getting smaller with increasing latitude*/
DECLARE maxLon FLOAT DEFAULT (LON + DEGREES(RADIUS/EARTH_RADIUS/COS(RADIANS(LAT))));
DECLARE minLon FLOAT DEFAULT (LON - DEGREES(RADIUS/EARTH_RADIUS/COS(RADIANS(LAT))));
SELECT *, acos(sin(LAT)*sin(radians(X(Location))) + cos(LAT)*cos(radians(X(Location)))*cos(radians(Y(Location))-LON))*EARTH_RADIUS As D
FROM (
Select *
From my_table
Where X(Location)>minLat And X(Location)<maxLat
And Y(Location)>minLon And Y(Location)<maxLon
) AS FIRST_CUT
WHERE acos(sin(LAT)*sin(X(Location)) + cos(LAT)*cos(X(Location))*cos(Y(Location)-LON))*EARTH_RADIUS < RADIUS
ORDER BY D;
END
我对该函数的大部分灵感来自:http ://www.movable-type.co.uk/scripts/latlong-db.html