Nano Hash - криптовалюты, майнинг, программирование

Использовать или не использовать обратное геокодирование для индексации таблицы MySQL с ~ 500 000 строк?

У меня есть таблица с примерно 5000 строк, которые содержат геокоординаты (широта + долгота) и информацию о местоположении (город, штат и страна) на ориентирах. Я использую эту таблицу для получения мест, ближайших к местоположению пользователя (например, близлежащие парки и т. д.).

На данный момент я фильтрую запрос путем обратного кодирования GPS-координат пользователя, чтобы получить его город, штат и страну (я использую геокодер Android). Однако я понял, что геокодер время от времени дает сбой, поэтому SQL-запрос на моем облачном сервере не возвращает никаких результатов.

Поэтому я думаю просто пропустить обратное кодирование, чтобы каждый раз получать хорошие результаты. Я просто использую геокоординаты, чтобы получить то, что хочу, например:

SELECT p.placeId, p.name,( 6371 * acos( cos( radians($latitude) ) * cos( radians( p.latitude ) ) * cos( radians( p.longitude ) - radians($user_longitude) ) + sin( radians($user_latitude) ) * sin( radians( p.latitude  ) ) ) ) AS distance ORDER BY distance

Тем не менее, размер моей таблицы увеличивается с каждым днем ​​и в конечном итоге может вырасти до 500 000. Как вы думаете, может ли выполнение вычисления расстояния для каждой строки стать проблемой производительности, когда моя таблица масштабируется до такого размера? Или таблица из 500 000 строк на самом деле не проблема?


  • если это когда-либо станет проблемой, вы можете ограничить запрос предложением WHERE, которое выбирает только записи, которые находятся в пределах (Lat-X,Lon-X):(Lat+X,Lon+X), где X - это некоторое приблизительное заранее определенное значение того, как далеко бы вы хотели искать в первую очередь. Например, не имеет особого смысла рассчитывать и заказывать на удаленных заправочных станциях во Флориде, когда вы находитесь в Калифорнии. 07.02.2013

Ответы:


1

Вы можете ограничить поиск радиусом и количеством требуемых записей. В данном случае 25 км и 20 записей.

SELECT  placeId, name, lat, lng,
( 3959 * acos( cos( radians($user_latitude) ) * cos( radians( lat ) ) 
* cos( radians( lng ) - radians($user_longitude)) + sin( radians($user_latitude))
* sin( radians( lat ) ) ) ) AS distance FROM myTable HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20

Этот запрос занял 2,08 секунды для выполнения в базе данных MySQL из 500 000 строк.

Было бы целесообразно использовать PDO с подготовленными операторами

07.02.2013

2

Да. Вы можете использовать пространственный индекс. Mssql, например, использует кривую заполнения пространства. Кривая уменьшает размерность, не пересекает саму себя и сохраняет некоторую исходную информацию о местоположении. Кривая часто используется в картографии. Прочтите об этом в блоге Ника, посвященном пространственной кривой Гильберта дерева квадрантов. Я написал кривую Гильберта для поиска пар широты и долготы, и это очень быстро. Вместо числа для индексации местоположения вы можете использовать строку из 4 букв. Затем вы можете искать местоположение в строке слева направо. Конечно, вы можете изменить индекс на lat-lng и обратно.

06.02.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..