2010-06-21 12 views
5

मैं अपनी तालिका से 100 अंक प्राप्त करने की कोशिश कर रहा हूं, किसी दिए गए बिंदु से सबसे कम दूरी के साथ।किसी दिए गए बिंदु से दूरी से पंक्तियों को क्रमबद्ध करने के लिए, mysql?

मैं

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

उपयोग कर रहा हूँ (हाँ, यह दर्दनाक है। मैं सिर्फ यह googled है। मुझे नहीं पता है कि कैसे सही ढंग से MySQL में दूरी को मापने के)

यह के लिए बहुत लंबा समय लगता है निष्पादित। EXPLAIN कहता है कि possible_keys नहीं हैं।

CREATE SPATIAL INDEX sp_index ON ip_group_city (pt); 

हालांकि मैं वास्तव में उसे सही ढंग से उपयोग करने के लिए पता नहीं है:

मैं pt स्तंभ पर एक SPATIAL सूचकांक बनाया। क्या आप मेरी मदद कर सकते हैं?

उत्तर

5

क्योंकि आप कहां खंड इसलिए कोई प्रभावित सूचकांक जरूरत नहीं है। मुझे लगता है कि आपको MBR_ (MySQL 5.0 या बाद में) या ST_ फ़ंक्शंस (MySQL 5.6 या बाद में) का उपयोग करके इस क्वेरी को बेहतर बनाना चाहिए। कुछ की तरह:

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

मैंने अतीत में इन प्रकार की गणना करने के लिए great circle equation का उपयोग किया है। मुझे यकीन नहीं है कि प्रदर्शन कैसे तुलना करता है लेकिन यह कोशिश करने और तुलना करने के लायक हो सकता है।

Here एक अच्छी एसओ पोस्ट है जो MySQL में इसे कैसे करें।

+1

यह बिल्कुल स्थानिक का उपयोग नहीं करता है, भी ... क्या यह (स्थानिक सूचकांक) के लिए है, तो है? –

+0

आपका एकमात्र समाधान है जो संभावित रूप से स्थानिक सूचकांक का उपयोग करेगा। मैं सिर्फ यह देखने की कोशिश कर रहा हूं कि प्रदर्शन की तुलना किस प्रकार की जाती है। –

+0

ओह। मैंने आपके जैसा ही एक विधि शुरू की, और बहुत खराब परिधि –

-1

इन सवालों पर एक नज़र डालें:

+0

मिला यह सॉर्ट नहीं कर रहा है और यह स्थानिक रूप से उपयोग नहीं करता है –

संबंधित मुद्दे