Dobry artykuł na temat wydajności geolokalizacji MySQL znajduje się tutaj .
EDYTUJ Jestem pewien, że używa stałego promienia. Nie jestem też w 100% pewien, że algorytm obliczania odległości jest najbardziej zaawansowany (tj. „przewierci” Ziemię).
Co ważne, algorytm jest tani, ponieważ pozwala na ograniczenie liczby rzędów do parkowania piłek, aby przeprowadzić prawidłowe wyszukiwanie odległości.
Algorytm wstępnie filtruje kandydatów w kwadracie wokół punktu źródłowego, a następnie oblicza odległość w milach .
Oblicz to wstępnie lub użyj procedury składowanej zgodnie z sugestią źródła:
# 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