1

1,000 万レコードのテーブルがあります。各レコードは 1 人を示します。各レコードには、person_id、緯度、経度、郵便番号があります。クエリを 1 つ選んで、半径 10 マイル以内に他に何人いるのかを知りたい (距離は緯度と経度から計算できる)。1,000 万件のレコードを検索し、距離を計算して 1,000 万件以内かどうかを確認するのは適切な方法ではありません。ということで、近辺の郵便番号だけで検索してみます(何とか入手)。特定の郵便番号を持つエントリを検索するにはどうすればよいですか (1,000 万レコードすべてではありません)。

4

1 に答える 1

1

緯度/経度を使用して、最初に 4 方向すべてに 10 マイル伸びるボックスを作成してみませんか?

次に、そのボックスに緯度/経度がある人を探すクエリを発行します。するWHEREを使用してください

x > xLess10 and x < xPlus10 and y > yLess10 and y < yPlus10

これでリストが小さくなり、その小さいリストの場合と同様の方法で実際の距離を計算できますsqrt((x1 - x2)^2 + (y1 - y2)^2)。しかし、それはマイルで区切られたグリッドではなく、球体で機能する必要があります.

を追加しand zip in (555555, 555556, etc)て、それがより速く実行されるかどうかを確認できます。ある郵便番号内の任意の場所から 10 マイル以内に位置する他のすべての郵便番号の事前計算されたリストは、別のテーブルに簡単に設定できます。

@Randy がコメントしたことで、これは北極と南極から 10 マイル以内の場所ではうまく機能しないことに気付きました。人口がかなり少ないので、それは問題ではないかもしれません。または、極と南 (または北) 10 マイルまたは x、y 位置の周囲の円内に全員を配置する別の方法を使用します。

また、緯度/経度からマイルに変換する方法を見つける必要があります。縦線は、赤道から離れるほど互いに近づきます。

于 2013-07-19T19:21:02.817 に答える