2010-06-21 2 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 

(Да, это больно. Я просто гугл это. Я понятия не имею, как измерить расстояние в MySQL правильно)

Это занимает очень много времени выполнить. EXPLAIN говорит, что нет possible_keys.

Я создал SPATIAL индекс на pt колонке:

CREATE SPATIAL INDEX sp_index ON ip_group_city (pt); 

Хотя я не знаю, как правильно его использовать. Не могли бы вы мне помочь?

ответ

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

о. Я начал с метода, похожего на ваш, и получил много худшего исполнения –

Смежные вопросы