Obliczanie odległości za pomocą tej funkcji jest dość kosztowne obliczeniowo, ponieważ obejmuje całą masę funkcji transcendentalnych. Będzie to problematyczne, gdy masz dużą liczbę wierszy do filtrowania.
Oto alternatywa, przybliżenie, które jest znacznie mniej kosztowne obliczeniowo:
Przybliżona odległość w milach:
sqrt(x * x + y * y)
where x = 69.1 * (lat2 - lat1)
and y = 53.0 * (lon2 - lon1)
Możesz poprawić dokładność tego przybliżonego obliczenia odległości, dodając funkcję matematyczną cosinusa:
Poprawiona przybliżona odległość w milach:
sqrt(x * x + y * y)
where x = 69.1 * (lat2 - lat1)
and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3)
Źródło:http://www.meridianworlddata.com/Distance-Calculation.asp
Przeprowadziłem kilka testów z losowo generowanymi zestawami danych.
- Różnica w dokładności trzech algorytmów jest minimalna , szczególnie na krótkich dystansach
- Najwolniejszy algorytm to oczywiście ten z funkcjami trygonometrycznymi (ten z twojego pytania). Jest 4x wolniejszy niż pozostałe dwa.
Zdecydowanie nie warto. Po prostu przejdź do przybliżenia.
Kod jest tutaj:http://pastebin.org/424186
Aby użyć tego w MySQL, utwórz procedurę składowaną który pobiera argumenty współrzędnych i zwraca odległość, możesz zrobić coś takiego:
SELECT columns
FROM table
WHERE DISTANCE(col_x, col_y, target_x, target_y) < 25