Nếu bạn có thể giới hạn khoảng cách tối đa giữa các thành phố và vị trí địa phương của mình, hãy tận dụng thực tế là một phút vĩ độ (bắc - nam) là một hải lý.
Đặt một chỉ mục trên bảng vĩ độ của bạn.
Hãy tạo cho mình một hàm được lưu trữ hasrsine (lat1, lat2, long1, long2, unit) từ công thức hasrsine được hiển thị trong câu hỏi của bạn. Xem bên dưới
Sau đó, làm điều này, với mylatitude, mylongitude và mykm.
SELECT *
from cities a
where :mylatitude >= a.latitude - :mykm/111.12
and :mylatitude <= a.latitude + :mykm/111.12
and haversine(:mylatitude,a.latitude,:mylongitude,a.longitude, 'KM') <= :mykm
order by haversine(:mylatitude,a.latitude,:mylongitude,a.longitude, 'KM')
Điều này sẽ sử dụng hộp giới hạn vĩ độ để loại trừ thô sơ các thành phố quá xa so với điểm của bạn. DBMS của bạn sẽ sử dụng quét phạm vi chỉ mục trên chỉ mục vĩ độ của bạn để nhanh chóng chọn ra các hàng trong bảng thành phố của bạn đáng được xem xét. Sau đó, nó sẽ chạy hàm hasrsine của bạn, hàm chứa tất cả các phép toán sin và cosine, chỉ trên các hàng đó.
Tôi đề xuất vĩ độ vì khoảng cách trên mặt đất của kinh độ thay đổi theo vĩ độ.
Lưu ý điều này là thô. Nó tốt cho một công cụ tìm cửa hàng, nhưng đừng sử dụng nó nếu bạn là một kỹ sư xây dựng - trái đất có hình elip và điều này giả sử nó là hình tròn.
(Xin lỗi về con số kỳ diệu 111,12. Đó là số km tính theo vĩ độ, tính bằng sáu mươi hải lý.)
Xem tại đây để biết hàm khoảng cách khả thi.