1

ランドマークの地理座標(緯度+経度)と位置情報(都市、州、国)を含む約5,000行のテーブルがあります。このテーブルを使用して、ユーザーの位置に最も近い場所(たとえば、近くの公園など)を取得します。

今のところ、ユーザーのgps座標を逆コーディングして、都市、州、国を取得することでクエリをフィルタリングしています(AndroidのGeocoderを使用しています)。ただし、Geocoderがときどき失敗するため、クラウドサーバーのSQLクエリが結果を返さないことに気付きました。

ですから、毎回良い結果が得られるように、逆コーディングをスキップすることを考えています。次のように、地理座標を使用して必要なものを取得します。

SELECT p.placeId, p.name,( 6371 * acos( cos( radians($latitude) ) * cos( radians( p.latitude ) ) * cos( radians( p.longitude ) - radians($user_longitude) ) + sin( radians($user_latitude) ) * sin( radians( p.latitude  ) ) ) ) AS distance ORDER BY distance

ただし、私のテーブルは毎日サイズが大きくなり、最終的には500,000まで大きくなる可能性があります。テーブルがそのサイズに拡大縮小されると、各行で距離計算を実行するとパフォーマンスの問題になる可能性があると思いますか?それとも、500,000行のテーブルは実際には問題ではありませんか?

4

2 に答える 2

1

検索は、必要な半径とレコード数に制限できます。この場合、25kmと20レコード。

SELECT  placeId, name, lat, lng,
( 3959 * acos( cos( radians($user_latitude) ) * cos( radians( lat ) ) 
* cos( radians( lng ) - radians($user_longitude)) + sin( radians($user_latitude))
* sin( radians( lat ) ) ) ) AS distance FROM myTable HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20

このクエリは、500,000行のMySQLデータベースで実行するのに2.08秒かかりました。

プリペアドステートメントでPDOを使用することをお勧めします

于 2013-02-07T16:39:02.920 に答える
1

はい。空間インデックスを使用できます。たとえば、Mssql は空間充填曲線を使用します。曲線は、それ自体と交差しない次元を削減し、元の場所情報を保持します。曲線は、マッピング アプリケーションでよく使用されます。これについては、nick の空間四分木ヒルベルト曲線ブログを参照してください。緯度経度ペアのヒルベルト曲線検索を作成しましたが、非常に高速です。場所をインデックス化する番号の代わりに、4 文字の文字列を使用できます。次に、文字列内の場所を左から右に検索できます。もちろん、インデックスを lat-lng とその逆に逆にすることもできます。

于 2013-02-06T23:38:58.737 に答える