Я пытаюсь найти наиболее эффективный способ решения следующей проблемы. У меня есть большая таблица locations
, в которой точки хранятся с использованием двух двойников, одного для Lat
и одного для Lng
, которые индексируются, а также radius
.
Я пытаюсь выбрать все locations
, которые находятся в радиусе заданной широты и долготы. Мой текущий подход заключается в запуске подзапроса, который сначала собирает все результаты в «географическом квадрате», а затем на основе этих результатов вычисляет расстояние и определяет, находится ли оно в пределах диапазона, например:
Подзапрос (выберите только те, которые находятся в пределах грубой мили x квадратной мили):
SELECT * FROM events WHERE $lat +0.015 > lat AND lat > $lat-0.015 AND $lng +0.02 > lng AND lng > $lng-0.02
Определить расстояние через гаверсинус:
SELECT * FROM ( the subquery ) WHERE Radius >= ( 20903520 * acos( cos(RADIANS(Lat)) * cos(RADIANS($lat)) * cos(RADIANS(Lng - $lng)) + sin(RADIANS(Lat)) * sin(RADIANS($lat))))
Мой вопрос в том, что это лучший способ приблизиться к этому? Я вполне уверен, что это один из наименее эффективных способов сделать это, и любая помощь очень ценится.
MySQL
,Subqueries
иEfficient
в одном предложении, если только где-то там нет "не". - person GolezTrol   schedule 12.02.2015