は今、私は億のインサートのテーブルがあります:私のバックエンドで最大緯度 - - マックス経度緯度からのX距離のためのSQL
CREATE TABLE o (
id int UNIQUE,
latitude FLOAT(10, 8),
longitude FLOAT(11, 8)
);
を私は緯度/長いユーザーを受け付けておりますそれからx距離以内にすべてを返そうとしています。
1つの結果ごとに距離計算式を実行するのではなく、X距離の最大緯度/経度を計算できると考えていました。
私たちは、最大緯度/最小緯度、最大/最小緯度を見つけることで正方形を作成しています。
これらの最大値を取得すると、この範囲の値に対してクエリを実行し、サブセットを大幅に小さくして実際の距離式をオンにします(つまり、X距離内の値を見つける)。
あなたに私の質問は: 私はより速く走りますか?セットを取得するために
オプション1)
- 億のエントリの距離式。
オプション2)
- の代わりに、我々は緯度/長い最小/最大を計算億のエントリのセットに距離式を行います。
- 1億エントリのテーブルからその範囲の値を選択してください
- 私たちの新しい小さなセットでは、距離の公式を行います。
オプション3)オプション2は、より速く次の問題が実際にその数学の問題を解決されている場合
- 何かがSQL
で、このために既に存在しています。
あなたが読書を続けることを見たい場合:
緯度/経度の距離の式
dlon = lon2 - lon1
dlat = lat2 - lat1
a = (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2
c = 2 * atan2(sqrt(a), sqrt(1-a))
d = R * c
D(1マイルを想定)、及びRは、(の半径であるため、明らかに我々はこれを並べ替えることができます地球は)設定値であるので、D/R = Cを得る。
問題は、C/2 = atan2(sqrt(a)、sqrt(1-a))をどのようにして計算するのだろうか?
あなたは車輪を再発明しています。 mysqlの空間データ型と関数を見てください。 – e4c5