Например, скажем, у меня есть таблица:
Business(BusinessID, Lattitude, Longitude)
Все индексируются, конечно. Также есть 1 миллион записей
Скажем, я хочу найти предприятия, близкие к 106,5, например, как бы я это сделал?
Если я сделаю
SELECT *
FROM Business
WHERE (Some formula to compute distance here) < 2000
например, или если я сделаю
SELECT *
FROM Business
TOP 20
В теории компьютер должен будет вычислять расстояние для всех предприятий, в то время как на практике должны рассчитываться только те, которые имеют широту и долготу в пределах определенного диапазона.
Итак, как я могу делать то, что я хочу в PhP или SQL, например?
Я до сих пор благодарен за ответ. Я использую mysql, и у них нет ничего более эффективного, чем очевидное решение. MySQL пространственная также не имеет функции вычисления расстояния.
(Раскрытие информации: я парень по Microsoft SQL Server, поэтому мои ответы зависят от этого.)
Чтобы действительно сделать это эффективно, есть две вещи, которые вы хотите: кэширование и поддержка собственных пространственных данных. Поддержка пространственных данных позволяет хранить географические и геометрические данные непосредственно в базе данных, не выполняя интенсивные / дорогостоящие вычисления на лету, и позволяет создавать индексы, чтобы очень быстро находить ближайшую точку к вашему текущему местоположению (или наиболее эффективный маршрут или что-либо еще).
Кэширование важно, если вы хотите масштабировать, точка. Самый быстрый запрос - тот, который вы никогда не делаете. Всякий раз, когда пользователь запрашивает самые близкие ему вещи, вы сохраняете его местоположение и набор результатов в кэше, таком как Redis или memcached, в течение нескольких часов. Места работы не будут меняться в течение 4 часов - ну, они могут измениться, если кто-то редактирует компанию, но вам не обязательно, чтобы она была немедленно обновлена во всех наборах результатов.
источник
Визг скорее всего использует ГИС
PostgreSQL имеет эталонную реализацию для ГИС с PostGIS . Yelp может использовать MySQL, который уступает во всех отношениях . В случае чего-то вроде Yelp, они почти наверняка сохраняют координаты,
Эти координаты почти наверняка есть в WGS84 и хранятся как тип Geography. В PostgreSQL и PostGIS это будет выглядеть примерно так:
Они бы заполнили эту таблицу. Затем они получают координаты WGS84 с вашего телефона и генерируют запрос, например, с помощью SQL Alchemy (в случае Yelp),
Для получения дополнительной информации см. Наш пространственный и проверить географические информационные системы @ StackExchange
источник