0

mysqldbを使用します。空間インデックスを持つポイントタイプである「latlong」列があります。緯度と経度に4マイル近い最も近い場所を取得したいと思います。

これまでのところ私はこれを持っています...

SELECT `postcode`,county, ( 3959 * acos( cos( radians(51.585738) ) * cos( radians( x(GeomFromText(astext(latlong))) ) ) * cos( radians( y(GeomFromText(astext(latlong))) ) - radians(-0.260878) ) + sin( radians(51.585738) ) * sin( radians( x(GeomFromText(astext(latlong))) ) ) ) ) AS distance  
FROM uk_p HAVING distance < 4 ORDER BY distance LIMIT 0 , 20

私は2900レコードしか持っておらず、約0.0277秒かかります。データベースが大きくなるにつれて、このクエリが遅くなるのではないかと心配しているので、このクエリを最適化する方法はありますか...

4

2 に答える 2

0

2 つの方法のいずれかを使用できます。1 つは、ラジアン変換と三角関数を事前に計算し、結果をテーブルの新しい列に格納することです。これにより、郵便番号ごとに変更されない作業の一部を節約できます。 . ターゲットまでの距離を計算する必要がありますが、それについてできることは何もありません。

もう 1 つのアプローチは、あまり正確ではありません。極の 1 つに近くないかなり小さな領域で作業している場合は、世界が (真剣に) フラットであると想定し、球面三角関数の代わりにデカルト座標計算を使用できます。

または、2 つのアプローチを組み合わせるには、すべての郵便番号を直線グリッドに 1 回マッピングし、その近似値が目的に十分であると信頼することができます。比較的狭い地理的領域を扱っている場合は、これが最適です。

つまり、特定のドメインについていくつかの仮定を立てることができれば、(現在使用している) 一般的なソリューションは必要ありません。

于 2012-03-14T12:21:33.890 に答える
0

クエリは 2900 レコードで問題ありません。大規模なデータセットの場合、中心を囲むバウンディング ボックスで範囲クエリを使用することができます。この質問の回答を参照してください。

于 2013-09-06T04:49:44.070 に答える