как отсортировать строки по расстоянию от заданной точки, mysql? - PullRequest
5 голосов
/ 21 июня 2010

Я пытаюсь получить 100 очков от моего стола с минимальным расстоянием до данной точки.

Я использую

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);

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

Ответы [ 3 ]

6 голосов
/ 03 декабря 2012

Поскольку у вас нет предложения WHERE, следовательно, нет затронутого индекса. Я думаю, что вы должны улучшить этот запрос, добавив, используя функции 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 голосов
/ 21 июня 2010

Посмотрите на эти вопросы:

0 голосов
/ 21 июня 2010

Я использовал уравнение большого круга для выполнения подобных вычислений в прошлом.Я не уверен, как сравнивается производительность, но, возможно, стоит попробовать и сравнить.

Здесь - это хороший SO-пост, в котором рассказывается, как это сделать в MySQL.

...