Hay un buen artículo sobre el rendimiento de geolocalización de MySQL aquí .
EDITAR Estoy bastante seguro de que esto está usando un radio fijo. Además, no estoy 100 % seguro de que el algoritmo para calcular la distancia sea el más avanzado (es decir, "perforará" la Tierra).
Lo que es significativo es que el algoritmo es barato para darle un límite de estadio de béisbol en el número de filas para hacer una búsqueda de distancia adecuada.
El algoritmo realiza un filtrado previo colocando a los candidatos en un cuadrado alrededor del punto de origen y luego calculando la distancia en millas. .
Calcule esto previamente o use un procedimiento almacenado como sugiere la fuente:
# 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