Calcular la distancia usando esa función es bastante costoso desde el punto de vista computacional, porque involucra un montón de funciones trascendentales. Esto será problemático cuando tenga una gran cantidad de filas para filtrar.
Aquí hay una alternativa, una aproximación que es mucho menos costosa computacionalmente:
Distancia aproximada en millas:
sqrt(x * x + y * y)
where x = 69.1 * (lat2 - lat1)
and y = 53.0 * (lon2 - lon1)
Puede mejorar la precisión de este cálculo de distancia aproximada agregando la función matemática coseno:
Distancia aproximada mejorada en millas:
sqrt(x * x + y * y)
where x = 69.1 * (lat2 - lat1)
and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3)
Fuente:http://www.meridianworlddata.com/Distance-Calculation.asp
Realicé un montón de pruebas con conjuntos de datos generados aleatoriamente.
- La diferencia en la precisión de los 3 algoritmos es mínima , especialmente en distancias cortas
- El algoritmo más lento es, por supuesto, el que tiene las funciones trigonométricas (el de su pregunta). Es 4 veces más lento que los otros dos.
Definitivamente no vale la pena. Solo ve con una aproximación.
El código está aquí:http://pastebin.org/424186
Para usar esto en MySQL, cree un procedimiento almacenado que toma argumentos de coordenadas y devuelve la distancia, entonces puedes hacer algo como:
SELECT columns
FROM table
WHERE DISTANCE(col_x, col_y, target_x, target_y) < 25