Yelpはどのようにしてデータベース内の距離を効率的に計算しますか?


9

たとえば、テーブルがあるとします。

Business(BusinessID, Lattitude, Longitude)

もちろん、すべてに索引が付けられています。また、100万件のレコードがあります

たとえば、106,5に最も近いビジネスを検索したい場合、どうすればよいでしょうか。

私が行った場合

SELECT *
FROM Business
WHERE (Some formula to compute distance here) < 2000

たとえば、または私が行う場合

SELECT *
FROM Business
TOP 20

理論的には、コンピューターはすべてのビジネスの距離を計算する必要がありますが、実際には、緯度と経度が特定の範囲内にあり、計算する必要があるビジネスのみが計算されます。

たとえば、PhPやSQLでやりたいことはどのようにしたらよいでしょうか。

これまでの答えに感謝しています。私はmysqlを使用していますが、それらには明らかな解決策よりも効率的なものはありません。MySQL空間には、距離計算機能もありません。

回答:


8

私が質問を正しく理解している場合(そして私が理解していると確信がない場合)、"(Some formula to compute distance here)"クエリを実行するたびにテーブルのすべての行の計算について心配していますか?

これは、上のインデックスを使用して程度に緩和することができるlatitudelongitude我々は唯一の私たちが実際にしたいサークルを含むポイントの「箱」のための距離を計算する必要がありますので。

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

ここで、「2000」という値の単位と、距離を計算している地球上のポイントに一致するように96、116などが選択されています。

これがインデックスをどの程度正確に使用するかは、RDBMSとそのプランナーが行う選択に依存します。

一般的に言えば、これはある種の最近傍探索を最適化する原始的な方法です。RDBMS がpostgresなどのGiSTインデックスをサポートしている場合は、代わりにそれらを使用することを検討してください。


mysqlを使用しました。ただし、一部のmysqlエンジンは、innodbではなく地理空間をサポートしています。
user4951 2012年

MySQLから変更するオプションがないことは正しいですか?その場合は、質問にmysql
ジャックはtopanswers.xyzを試してみてください

実際、私は今myisamの補助テーブルを追加していますが、これをどのように効率的に行うのですか?
user4951 2012年

さて、mongodbを使用できます。私はそれを決めていません。ただし、私はmysqlに最も精通しています。
user4951 2012年

1
私のアドバイスは、可能であればpostgresに慣れることです。MongoDBと比較すると、MySQLに非常によく似ており、空間データの確かな履歴があり、他の場所でのコメントは「無料」を好むことを示しています。
ジャックはtopanswers.xyzを試してみると12

6

(開示:私はMicrosoft SQL Serverの人なので、私の答えはそれに影響されます。)

本当に効率的に行うには、キャッシングとネイティブ空間データのサポートの2つが必要です。 空間データのサポートにより、地理的および幾何学的なデータをデータベースに直接格納できます。その際、集中的または高価な計算をその場で行う必要はありません。また、インデックスを作成して、現在の場所(または最も効率的なルートなど)に最も近いポイントをすばやく見つけることができます。

スケーリングする場合は、キャッシングが重要です。最速のクエリは、あなたが作ることのないものです。ユーザーが彼に最も近いものを要求するときはいつでも、その場所と結果セットをRedisやmemcachedなどのキャッシュに一定時間保存します。お店やサービスの場所は4時間は変更されません。まあ、誰かがお店を編集した場合、それらは変更される可能性がありますが、すべての結果セットですぐに更新する必要はありません。


SQL Serverが近くのポイントのリストを取得するのに役立つ方法で実際に空間データにインデックスを付けるかどうかは、リンクから解決できません。
ジャックはtopanswers.xyzしようと言う


問題は、私がmysqlを使用していて、ジャックダグラスが規定したものよりも効率的なアルゴリズムがないことを確認しました。mysqlはキャッシングのようなことも行うのでしょうか。Microsoft SQLは支払われ、mysqlは無料です
user4951 2011

1
ビジネスの場所は常に変わるわけではありませんが、人々の場所は変わります。
user4951

0

YelpはおそらくGISを使用しています

PostgreSQLには、PostGISを使用したGISのリファレンス実装があります。Yelpは、あらゆる面で劣っているMySQLを使用している可能性があります。Yelpのようなものの場合、彼らはほぼ間違いなくコーディネートを維持します、

  • ユーザー
  • 潜在的な目的地

これらの座標はほぼ確実にWGS84にあり、地理タイプとして保存されます。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 Yelpを使用して(Yelpの場合は)このようなクエリを生成します。

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

詳細については、私たちの参照し、地理情報システム@ StackExchangeをチェックしてください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.