Расчет расстояния с использованием этой функции довольно затратен в вычислительном отношении, поскольку включает в себя целый ряд трансцендентных функций.Это будет проблематично, если у вас есть большое количество строк для фильтрации.
Вот альтернатива, приблизительное вычисление, которое намного дешевле в вычислительном отношении:
Приблизительное расстояние в милях:
sqrt(x * x + y * y)
where x = 69.1 * (lat2 - lat1)
and y = 53.0 * (lon2 - lon1)
Вы можете повысить точность вычисления приблизительного расстояния, добавив математическую функцию косинуса:
Улучшенное приблизительное расстояние в милях:
sqrt(x * x + y * y)
where x = 69.1 * (lat2 - lat1)
and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3)
Источник: http://www.meridianworlddata.com/Distance-Calculation.asp
Я провел несколько тестов со случайно сгенерированными наборами данных.
- Разница в точности для трех алгоритмов составляет минимальная , особенно на небольших расстояниях
- Самый медленный алгоритм - это, конечно, алгоритм с триггерными функциями (тот, что на вашем вопросе).Это в 4 раза медленнее, чем два других.
Определенно не стоит.Просто перейдите к приближению.
Код здесь: http://pastebin.org/424186
Чтобы использовать это в MySQL, создайте хранимую процедуру , которая принимает аргументы координат и возвращает расстояние,тогда вы можете сделать что-то вроде:
SELECT columns
FROM table
WHERE DISTANCE(col_x, col_y, target_x, target_y) < 25