Поиск по расстоянию в SQL - PullRequest
       2

Поиск по расстоянию в SQL

0 голосов
/ 29 августа 2011

Я планирую веб-сайт (Drupal / MySQL), который должен искать довольно большую базу данных, основываясь на расстоянии от местоположения (мы начинаем с ~ 20 000 местоположений). На данный момент лучшее решение, которое я нашел для поиска разумным способом, - это использовать пользовательскую функцию в SQL для вычисления расстояния между координатами, например ::10000

SELECT *, CoordinateDistanceMiles(lat, lon, ${inputLat}, ${inputLon}) as distance
FROM items WHERE distance < {$radius}

(с использованием функции расстояния Джона Дайера или аналогичной)

Однако я также читал, что UDF очень неэффективны. Моя вторая идея (и предварительный план) состоит в том, чтобы вложить в этот запрос другой запрос, чтобы сузить его область и, следовательно, запустить UDF для гораздо меньшего подмножества элементов, например ::100100.

SELECT *, CoordinateDistanceMiles(lat, lon, ${inputLat}, ${inputLon}) as distance
FROM (
    SELECT * FROM items WHERE
        lat BETWEEN ${inputLat - const} AND ${inputLat + const} AND
        lon BETWEEN ${inputLon - const} AND ${inputLon + const}
) WHERE distance < ${radius}

Эта модель сделает поиск более быстрым или просто более запутанным? Есть ли лучшие решения?

1 Ответ

0 голосов
/ 29 августа 2011

Затраты на использование UDF здесь незначительны, если вы выполняете сканирование по distance < ${radius} и имеете 2 сравнения на основе диапазона (их нельзя оптимизировать с помощью индексов).

Так что не беспокойтесь о «неэффективности» UDF и используйте его, так как он гораздо более читабелен.

...