2010-06-21 37 views
5

Tôi đang cố gắng lấy 100 điểm từ bảng của mình với khoảng cách thấp nhất đến một điểm nhất định.cách sắp xếp các hàng theo khoảng cách từ một điểm nhất định, mysql?

Tôi đang sử dụng

SELECT *, GLENGTH(
      LINESTRINGFROMWKB(
       LINESTRING(
       ASBINARY(
        POINTFROMTEXT("POINT(40.4495 -79.988)") 
       ), 
       ASBINARY(pt) 
      ) 
      ) 
     ) 
AS `distance` FROM `ip_group_city` ORDER BY distance LIMIT 100 

(Yeah, đó là đau đớn. Tôi vừa mới googled nó. Tôi không có ý tưởng làm thế nào để đo khoảng cách trong MySQL chính xác)

Phải mất thời gian rất dài cho thi hành. EXPLAIN nói rằng không có possible_keys.

Tôi tạo ra một chỉ số SPATIAL trên cột pt:

CREATE SPATIAL INDEX sp_index ON ip_group_city (pt); 

Mặc dù tôi thực sự không biết làm thế nào để sử dụng nó một cách chính xác. Bạn có thể giúp tôi không?

Trả lời

5

Bởi vì bạn không có mệnh đề WHERE do đó không có chỉ số ảnh hưởng. Tôi nghĩ bạn nên cải thiện truy vấn này bằng cách thêm các hàm MBR_ (MySQL 5.0 hoặc mới hơn) hoặc ST_ (MySQL 5.6 trở lên). Một cái gì đó như:

SELECT *, GLENGTH(
      LINESTRINGFROMWKB(
       LINESTRING(
       ASBINARY(
        POINTFROMTEXT("POINT(40.4495 -79.988)") 
       ), 
       ASBINARY(pt) 
      ) 
      ) 
     ) 
AS `distance` 
FROM `ip_group_city` 
WHERE 
MBRWithin(
     pt, -- your point 
     GeomFromText('Polygon(-- your line (in polygon format) from pt to target point 
         (
          #{bound.ne.lat} #{bound.ne.lng}, --North East Lat - North East Long 
          #{bound.ne.lat} #{bound.sw.lng}, --North East Lat - South West Long 
          #{bound.sw.lat} #{bound.sw.lng}, -- 
          #{bound.sw.lat} #{bound.ne.lng}, 
          #{bound.ne.lat} #{bound.ne.lng} 
         ) 
        )') 
    ) 
ORDER BY distance LIMIT 100 
0

Tôi đã sử dụng great circle equation để thực hiện các loại tính toán này trong quá khứ. Tôi không chắc làm thế nào so sánh hiệu suất nhưng nó có thể là giá trị thử nó và so sánh.

Here là một bài đăng tốt về SO làm cách nào để thực hiện điều đó trong MySQL.

+1

nó không sử dụng không gian chút nào ... nó là gì (chỉ số không gian) cho, sau đó? –

+0

Yours là loại giải pháp duy nhất có khả năng sử dụng chỉ mục không gian. Tôi chỉ đề xuất một phương pháp khác đáng để xem hiệu suất so sánh như thế nào. –

+0

oh. Tôi bắt đầu với một phương pháp, tương tự như của bạn, và có một sự lãng phí tồi tệ nhất rất nhiều –

Các vấn đề liên quan