Има добър документ за ефективността на геолокацията на MySQL тук .
РЕДАКТИРАНЕ Със сигурност това използва фиксиран радиус. Също така не съм 100% сигурен, че алгоритъмът за изчисляване на разстоянието е най-напреднал (т.е. ще „пробива“ през Земята).
Важното е, че алгоритъмът е евтин, за да ви даде ограничение за паркиране на топката за броя на редовете, за да извършите правилно търсене на разстояние.
Алгоритъмът филтрира предварително, като взема кандидати в квадрат около изходната точка, след което изчислява разстоянието в мили .
Предварително изчислете това или използвайте съхранена процедура, както предлага източникът:
# Pseudo code
# user_lon and user_lat are the source longitude and latitude
# radius is the radius where you want to search
lon_distance = radius / abs(cos(radians(user_lat))*69);
min_lon = user_lon - lon_distance;
max_lon = user_lon + lon_distance;
min_lat = user_lat - (radius / 69);
max_lat = user_lat + (radius / 69);
SELECT dest.*,
3956 * 2 * ASIN(
SQRT(
POWER(
SIN(
(user_lat - dest.lat) * pi() / 180 / 2
), 2
) + COS(
user_lat * pi() / 180
) * COS(
dest.lat * pi() / 180
) * POWER(
SIN(
(user_lon - dest.lon) * pi() / 180 / 2
), 2
)
)
) as distance
FROM dest
WHERE
dest.lon between min_lon and max_lon AND
dest.lat between min_lat and max_lat
HAVING distance < radius
ORDER BY distance
LIMIT 10