MySQL эффективность подзапросов в больших базах данных

Я пытаюсь найти наиболее эффективный способ решения следующей проблемы. У меня есть большая таблица 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))))

Мой вопрос в том, что это лучший способ приблизиться к этому? Я вполне уверен, что это один из наименее эффективных способов сделать это, и любая помощь очень ценится.


person Kony2013    schedule 12.02.2015    source источник
comment
Вы не должны использовать MySQL, Subqueries и Efficient в одном предложении, если только где-то там нет "не".   -  person GolezTrol    schedule 12.02.2015
comment
Очень верно, однако я в полной растерянности, как лучше всего подойти к этому. Какие-нибудь мысли?   -  person Kony2013    schedule 12.02.2015
comment
Я не уверен, но у MySQL есть некоторые интересные функции Lat/Long. Может быть, вы можете посмотреть ответы на самый быстрый способ Найдите расстояние между двумя точками широты/долготы или погрузитесь в ГЕО пространственные расширения.   -  person GolezTrol    schedule 12.02.2015


Ответы (1)


Другое решение можно найти здесь: http://mysql.rjweb.org/doc.php/latlng Это по существу O (1), тогда как большинство решений на основе индексов — O (sqrt (N)).

Моя техника работает с InnoDB. Для пространственных индексов требуется MyISAM (до версии 5.7).

person Rick James    schedule 02.03.2015