2010-02-09 40 views
9

tôi là tạo ra một cuộc gọi MySQL sử dụng PHP, tôi đang tính toán khoảng cách sử dụng forumula haversine:Tối ưu hóa một haversine thức gọi SQL trong PHP

SELECT name, id, 
    (6371 * acos(cos(radians(' . $lat . ')) 
    * cos(radians(geoname.latitude)) 
    * cos(radians(geoname.longitude) - radians(' . $lon . ')) 
    + sin(radians(' . $lat . ')) 
    * sin(radians(geoname.latitude)))) AS distance 

Câu hỏi của tôi là; cách nào tốt nhất để làm tất cả phép tính này trong SQL? Truy vấn này tìm kiếm một bảng có khoảng 1000 bản ghi. Nó sẽ hiệu quả hơn để thực hiện một số phép tính trong PHP chứ không phải là SQL? Có cách nào tốt hơn để tối ưu hóa truy vấn này không?

Trả lời

4

Bạn đang sử dụng Spherical Law of Cosines formula, không phải là Haversine Formula (đó là hơi chậm hơn).

Làm toán trong MySQL có lẽ sẽ nhanh hơn nhiều, tôi khuyên bạn nên read this question Tôi hỏi một thời gian trở lại, như cho việc tối ưu tốc độ mà bạn chắc chắn nên đọc xuất sắc giấy Geo Proximity Search with MySQL, đặc biệt chú ý tới các trang 8- 14 và 19.

+0

bạn có thể vui lòng cho tôi biết công thức cuối cùng chúng tôi đã sử dụng không? – Hunt

2

Đối với trình lập chỉ mục MySQL siêu nhanh, hãy kiểm tra Sphinx. Nó là cực kỳ nhanh chóng cho việc tìm kiếm những gì bạn cần trong cơ sở dữ liệu MySQL của bạn, và tính toán địa lý/khoảng cách tự động.

Hướng dẫn: Geo/Spatial Search Using Sphinx Search and PHP