Không phải là câu trả lời cụ thể của MySql, nhưng nó sẽ cải thiện hiệu suất của câu lệnh sql của bạn.
Những gì bạn đang làm hiệu quả là tính toán khoảng cách đến mọi điểm trong bảng, để xem liệu nó có nằm trong 10 đơn vị của một điểm nhất định không.
Những gì bạn có thể làm trước khi bạn chạy sql này, là tạo bốn điểm vẽ một hộp 20 đơn vị ở một bên, với điểm của bạn ở trung tâm tức là. (x1, y1). . . (x4, y4), trong đó (x1, y1) là (cho dài + 10 đơn vị, đã choLat + 10 đơn vị). . . (đã choLong - 10 đơn vị, đã cho đơn vị -10 đơn vị).
Trên thực tế, bạn chỉ cần hai điểm, trên cùng bên trái và dưới cùng bên phải gọi chúng (X1, Y1) và (X2, Y2)
Bây giờ câu lệnh SQL của bạn sử dụng các điểm này để loại trừ các hàng chắc chắn lớn hơn 10u so với điểm đã cho của bạn, nó có thể sử dụng các chỉ mục về vĩ độ và kinh độ, do đó sẽ là các đơn đặt hàng có cường độ nhanh hơn so với những gì bạn hiện có.
ví dụ
select . . .
where locations.lat between X1 and X2
and locations.Long between y1 and y2;
Cách tiếp cận hộp có thể trả về giá trị dương (bạn có thể lấy điểm ở các góc của hộp> 10u từ điểm đã cho), vì vậy bạn vẫn cần tính khoảng cách của mỗi điểm. Tuy nhiên, điều này một lần nữa sẽ nhanh hơn nhiều vì bạn đã hạn chế đáng kể số điểm cần kiểm tra vào các điểm trong hộp.
Tôi gọi kỹ thuật này là "Suy nghĩ bên trong chiếc hộp" :)
EDIT: Điều này có thể được đưa vào một câu lệnh SQL không?
Tôi không biết mySql hoặc Php có khả năng gì, xin lỗi. Tôi không biết nơi tốt nhất để xây dựng bốn điểm hoặc làm thế nào chúng có thể được chuyển đến truy vấn mySql trong Php. Tuy nhiên, khi bạn có bốn điểm, không có gì ngăn cản bạn kết hợp câu lệnh SQL của riêng bạn với câu lệnh của tôi.
select name,
( 3959 * acos( cos( radians(42.290763) )
* cos( radians( locations.lat ) )
* cos( radians( locations.lng ) - radians(-71.35368) )
+ sin( radians(42.290763) )
* sin( radians( locations.lat ) ) ) ) AS distance
from locations
where active = 1
and locations.lat between X1 and X2
and locations.Long between y1 and y2
having distance < 10 ORDER BY distance;
Tôi biết với MS SQL Tôi có thể xây dựng một câu lệnh SQL khai báo bốn số float (X1, Y1, X2, Y2) và tính toán chúng trước câu lệnh chọn "chính", như tôi đã nói, tôi không biết liệu điều này có thể được thực hiện với MySql. Tuy nhiên, tôi vẫn có xu hướng xây dựng bốn điểm trong C # và chuyển chúng dưới dạng tham số cho truy vấn SQL.
Xin lỗi tôi không thể giúp đỡ nhiều hơn, nếu bất cứ ai có thể trả lời các phần cụ thể của MySQL & Php về điều này, vui lòng chỉnh sửa câu trả lời này để làm như vậy.