2010-06-21 11 views
5

Sto provando a ottenere 100 punti dal mio tavolo con una distanza minima da un dato punto.come ordinare le righe per una distanza da un punto dato, mysql?

sto usando

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

(Sì, è doloroso. Ho appena googled. Non ho idea di come misurare la distanza in MySQL correttamente)

Ci vuole molto tempo per eseguire. EXPLAIN dice che non ci sono possible_keys.

ho creato un indice SPATIAL sulla colonna pt:

CREATE SPATIAL INDEX sp_index ON ip_group_city (pt); 

Anche se non so davvero come usarlo correttamente. Potete per favore aiutarmi?

risposta

5

Perché non si dispone di clausola WHERE quindi alcun indice interessata. Penso che dovresti migliorare questa query aggiungendo le funzioni MBR_ (MySQL 5.0 o successive) o ST_ (MySQL 5.6 o successive). Qualcosa di simile:

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

Ho utilizzato il great circle equation per eseguire questi tipi di calcoli in passato. Non sono sicuro di come il rendimento si paragona, ma potrebbe valerne la pena provarlo e confrontarlo.

Here è un post SO buono che spiega come farlo in MySQL.

+1

non fa uso dello spazio a tutti, anche ... di cosa si tratta (indice spaziale), allora? –

+0

Il tuo è l'unico tipo di soluzione che potenzialmente utilizza l'indice spaziale. Sto solo suggerendo un altro metodo che vale la pena provare per vedere come si confronta il rendimento. –

+0

oh. Ho iniziato con un metodo, simile al tuo, e ho ottenuto la peggiore perfomance –