Det finns en bra artikel om MySQL-geolokaliseringsprestanda här .
REDIGERA Ganska säker på att detta använder fast radie. Jag är inte heller 100% säker på att algoritmen för att beräkna avstånd är den mest avancerade (dvs. den "borrar" genom jorden).
Vad som är viktigt är att algoritmen är billig för att ge dig en bollparksgräns på antalet rader för att göra korrekt avståndssökning.
Algoritmen förfiltrerar genom att ta kandidater i en kvadrat runt källpunkten och sedan beräkna avståndet i mil .
Beräkna detta i förväg eller använd en lagrad procedur som källan föreslår:
# 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