Я планирую веб-сайт (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}
Эта модель сделает поиск более быстрым или просто более запутанным? Есть ли лучшие решения?