Как Yelp эффективно рассчитывает расстояние в базе данных?

9

Например, скажем, у меня есть таблица:

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 пространственная также не имеет функции вычисления расстояния.

user4951
источник

Ответы:

8

Если я правильно понимаю вопрос (и я не уверен, что понимаю), вы беспокоитесь о вычислениях "(Some formula to compute distance here)"для каждой строки в таблице каждый раз, когда делаете запрос?

Это может быть смягчено до некоторой степени с помощью индексов latitudeи longitudeпоэтому мы имеем только вычислить расстояние для «шкатулки» точек , содержащих круг , мы на самом деле хотим:

select * from business
where (latitude>96 and latitude<116) and 
      (longitude>-5 and longitude<15) and 
      (Some formula to compute distance here) < 2000

Где 96, 116 и т. Д. Выбраны в соответствии с единицей значения «2000» и точкой на земном шаре, с которой вы рассчитываете расстояния.

То, насколько точно это использует индексы, будет зависеть от вашей СУБД и выбора, который делает ее планировщик.

В общих чертах это примитивный способ оптимизации поиска ближайшего соседа . Если ваша СУБД поддерживает индексы GiST , такие как postgres, вам следует рассмотреть возможность их использования.

Джек говорит, попробуйте topanswers.xyz
источник
Я использовал MySQL. Тем не менее, некоторые движки mysql поддерживают геопространственные данные, но не innodb.
user4951
Я прав, что у вас нет возможности перейти с MySQL? В этом случае, пожалуйста, пометьте вопрос mysql
Джек говорит, попробуйте topanswers.xyz
На самом деле теперь я добавляю вспомогательную таблицу myisam, как мне тогда сделать это эффективно?
user4951
Ну, я могу использовать mongodb. Я не решил это. Тем не менее, я наиболее знаком с MySQL.
user4951
1
Я бы посоветовал ознакомиться с postgres, если это вообще возможно - по сравнению с MongoDB он гораздо больше похож на MySQL и имеет солидную историю с пространственными данными, а ваши комментарии в других местах указывают на то, что вы предпочитаете «бесплатный».
Джек говорит, что попробуйте topanswers.xyz
6

(Раскрытие информации: я парень по Microsoft SQL Server, поэтому мои ответы зависят от этого.)

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

Кэширование важно, если вы хотите масштабировать, точка. Самый быстрый запрос - тот, который вы никогда не делаете. Всякий раз, когда пользователь запрашивает самые близкие ему вещи, вы сохраняете его местоположение и набор результатов в кэше, таком как Redis или memcached, в течение нескольких часов. Места работы не будут меняться в течение 4 часов - ну, они могут измениться, если кто-то редактирует компанию, но вам не обязательно, чтобы она была немедленно обновлена ​​во всех наборах результатов.

Брент Озар
источник
По вашей ссылке я не могу понять, действительно ли SQL Server индексирует пространственные данные таким образом, чтобы это было полезно для получения списка соседних точек - не так ли?
Джек говорит, что попробуйте topanswers.xyz
Похоже, что нет,
говорит Джек, попробуйте topanswers.xyz
Дело в том, что я использую mysql, и я убедился, что у них нет алгоритма, более эффективного, чем тот, который прописал Джек Дуглас. Интересно, будет ли mysql заниматься такими вещами, как кэширование? Microsoft SQL платный, а MySQL бесплатный
user4951
1
Местоположение бизнеса не будет меняться все время, как и местоположение людей.
user4951
0

Визг скорее всего использует ГИС

PostgreSQL имеет эталонную реализацию для ГИС с PostGIS . Yelp может использовать MySQL, который уступает во всех отношениях . В случае чего-то вроде Yelp, они почти наверняка сохраняют координаты,

  • Пользователь
  • Потенциальные направления

Эти координаты почти наверняка есть в WGS84 и хранятся как тип Geography. В PostgreSQL и PostGIS это будет выглядеть примерно так:

CREATE TABLE businesses (
  id   int               GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  name text,
  geog geography(point)
);
CREATE INDEX ON businesses USING gist(geog);
.... fill table
ANALYZE businesses;

Они бы заполнили эту таблицу. Затем они получают координаты WGS84 с вашего телефона и генерируют запрос, например, с помощью SQL Alchemy (в случае Yelp),

SELECT *
FROM businesses AS b
WHERE ST_DWithin( b.geog, ST_MakePoint(userLong,userLat) );

Для получения дополнительной информации см. Наш и проверить географические информационные системы @ StackExchange

Эван Кэрролл
источник