Calcolare la distanza usando quella funzione è piuttosto costoso dal punto di vista computazionale, perché coinvolge un intero gruppo di funzioni trascendentali. Questo sarà problematico quando hai un numero elevato di righe su cui filtrare.
Ecco un'alternativa, un'approssimazione molto meno costosa dal punto di vista computazionale:
Distanza approssimativa in miglia:
sqrt(x * x + y * y)
where x = 69.1 * (lat2 - lat1)
and y = 53.0 * (lon2 - lon1)
Puoi migliorare la precisione di questo calcolo della distanza approssimativa aggiungendo la funzione matematica del coseno:
Migliorata la distanza approssimativa in miglia:
sqrt(x * x + y * y)
where x = 69.1 * (lat2 - lat1)
and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3)
Fonte:http://www.meridianworlddata.com/Distance-Calculation.asp
Ho eseguito una serie di test con set di dati generati casualmente.
- La differenza di precisione per i 3 algoritmi è minima , soprattutto a brevi distanze
- L'algoritmo più lento è, ovviamente, quello con le funzioni trigonometriche (quello sulla tua domanda). È 4 volte più lento degli altri due.
Sicuramente non ne vale la pena. Basta fare un'approssimazione.
Il codice è qui:http://pastebin.org/424186
Per utilizzarlo su MySQL, crea una procedura memorizzata che accetta argomenti di coordinate e restituisce la distanza, quindi puoi fare qualcosa come:
SELECT columns
FROM table
WHERE DISTANCE(col_x, col_y, target_x, target_y) < 25