У меня есть MySQL-таблица (MyISAM), содержащая около 200 тыс. Записей пар лат / лонг, из которых я выбираю, исходя из расстояния между парами (формула большого круга) из другой пары лат / лонг.(например, все записи, которые находятся в радиусе 10 км от 50.281852, 2.504883)
Моя проблема в том, что этот запрос занимает около 0,28 сек.запустить только для этих 200 000 записей (которые продолжают получать больше с каждым днем).Время 0,28 сек.было бы нормально нормально, этот запрос выполняется очень часто, так как он обеспечивает основную функцию моего веб-приложения, и часто это часть большого запроса.
Есть ли способ ускорить это?Obviosly MySQL должен каждый раз проходить все 200 тыс. Записей и выполнять формулу большого круга для каждой записи.Я читал кое-что о гео-хешировании, R-деревьях и тому подобном здесь на stackoverflow, но я не думаю, что это именно то, чего я хочу.Частично потому, что я никогда не был большим поклонником математики, но в основном потому, что я думаю, что эта проблема уже была решена кем-то умнее меня в библиотеке / расширении / и т.д.это было тщательно протестировано и регулярно обновляется.
Кажется, что MySQL имеет пространственное расширение, но у него нет функции расстояния.Должен ли я смотреть на другую базу данных, чтобы поместить эти пары координат?PostgreSQL, похоже, имеет довольно зрелое пространственное расширение.Вы знаете что-нибудь об этом?Или PostgreSQL слишком просто использует формулу большого круга для получения всех записей в определенном регионе?
Возможно, существует специализированный автономный продукт или расширение mysql, которое уже делает то, что я ищу?
Или, может быть, есть библиотека PHP, которую я мог бы использовать для расчетов?Используя APC, я мог легко поместить пары lat-long в память (эти 200-килобайтные записи занимают около 5 МБ), а затем выполнить запрос внутри PHP.Однако проблема с этим подходом состоит в том, что тогда у меня будет запрос MySQL, такой как SELECT .. FROM .. WHERE, идентификатор в (id1, id2, ..) для всех результатов, который может достигать нескольких тысяч.Насколько хорошо MySQL обрабатывает подобные запросы?И потом (поскольку это задача обработки чисел) будет ли выполнение этого в PHP достаточно быстрым?
Любые другие идеи, которые я должен / не должен делать?
Для полноты, вотпример запроса, лишенный каких-либо не относящихся к делу частей (как я уже говорил, обычно это часть большого запроса, в котором я объединяю несколько таблиц):
SELECT id, 6371 * acos( sin( radians( 52.4042924 ) ) * sin( radians( lat ) ) + cos( radians( 50.281852 ) ) * cos( radians( lat ) ) * cos( radians( 2.504883 ) - radians( lon ) ) ) AS dst
FROM geoloc
HAVING dst <10
ORDER BY dst ASC
Спасибо!