Có một bài báo tốt về hiệu suất vị trí địa lý của MySQL tại đây .
CHỈNH SỬA Khá chắc chắn rằng điều này đang sử dụng bán kính cố định. Ngoài ra, tôi không chắc chắn 100% rằng thuật toán tính khoảng cách là tiên tiến nhất (tức là nó sẽ "khoan" xuyên qua Trái đất).
Điều quan trọng là thuật toán rất rẻ để cung cấp cho bạn giới hạn công viên bóng về số hàng để thực hiện tìm kiếm khoảng cách thích hợp.
Thuật toán lọc trước bằng cách lấy các ứng cử viên trong một hình vuông xung quanh điểm nguồn, sau đó tính khoảng cách bằng dặm .
Tính toán trước điều này hoặc sử dụng quy trình được lưu trữ như nguồn gợi ý:
# 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