2010-06-21 8 views
5

Ich versuche 100 Punkte von meinem Tisch mit der niedrigsten Entfernung zu einem bestimmten Punkt zu bekommen.wie Zeilen um eine Entfernung von einem bestimmten Punkt zu sortieren, mysql?

Ich verwende

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

(Ja, das ist schmerzhaft. Ich habe es einfach googeln. Ich habe keine Ahnung, wie Entfernung richtig in MySQL messen)

Es dauert sehr lange, ausführen. EXPLAIN sagt, dass es keine possible_keys gibt.

Ich habe einen SPATIAL Index auf der pt Spalte:

CREATE SPATIAL INDEX sp_index ON ip_group_city (pt); 

Obwohl ich nicht wirklich wissen, wie man es richtig verwenden. Kannst du mir bitte helfen?

Antwort

5

Weil Sie haben keine WHERE-Klausel daher keinen betroffenen Index. Ich denke, Sie sollten diese Abfrage verbessern, indem Sie MBR_ (MySQL 5.0 oder höher) oder ST_ Funktionen (MySQL 5.6 oder höher) hinzufügen. Etwas wie:

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

habe ich die great circle equation zu tun, diese Art von Berechnungen in der Vergangenheit verwendet. Ich bin mir nicht sicher, wie die Leistung ist, aber es könnte sich lohnen, es zu versuchen und zu vergleichen.

Here ist eine gute SO Post das geht darüber, wie es in MySQL zu tun.

+1

es verwendet überhaupt nicht räumliche ... was ist es (räumlicher Index) für, dann? –

+0

Ihre einzige Lösung ist die Verwendung des räumlichen Index. Ich schlage nur eine andere Methode vor, die es wert ist zu versuchen, zu sehen, wie sich die Leistung vergleicht. –

+0

oh. Ich habe mit einer Methode begonnen, die der Ihren ähnlich ist, und eine sehr schlechte Performance bekommen. –