2017-01-01 5 views
0

をCOORDS:MYSQL - ポイントを取得するための最速の方法は、周りの私は場所によって周囲に「私を」のポイントを取得しようとしていると、それは非常に簡単です

select * from X where ((SQRT(POW(69.1 * (a.lat - 49.201441), 2) + 
POW(69.1 * (16.161299 - a.lng) * COS(a.lat/57.3), 2))) <='1') LIMIT 5 

*

my location = 49.201441;16.161299 
distance = 1 (mile) 

は、このクエリは、私に返し5 1マイルの距離で "私"の周りを指します。これはかなり早いですが、私のテーブルにはちょうど...私は知らないでしょう、おそらく5000行。

私は200 000行のテーブルでこのクエリを使用していますが、それは非常に遅いです!たぶん.. 2〜7秒、限界が1であっても差はない。

誰かが私にそれを説明してくれますか?ありがとう、たくさんの人!

BTW:私のクエリにこの部分のクエリが含まれていない場合は、おそらく0.0008秒かかるので、クエリの第2部分は正しいです。

+0

http://stackoverflow.com/a/39257396/575376 –

答えて

0

私はあなたの近くの人を見つけるためにこれを使用しています。

テーブル名:USER_LOCATION

ID |ユーザ名|緯度|経度、私は距離はマイルのためですが、どのようなこれはないですがかかることを確認していない

緯度ユーザーマイナスデータベースから各人物。ユーザーの緯度と経度が1以内の場合、結果に表示されます。

最大の問題は、1が1マイルと等しくないことです。それは私が信じている10マイルに近づいています(それはずっと前ですが、私が覚えることができない10マイルにはならないかもしれません)。しかし、あなたはいつもこれを変えることができます。別の問題は、基本的には常に人の場所を更新する必要があるということです。それはそれほど悪くはありませんが、多くのユーザーがいるサーバーが遅い場合、サーバーが遅くなる可能性があります。

これは高速で動作します...最高の解決策ではありませんが、あなたのために働くかもしれません。私にとってそれは素晴らしい場所を示していた。

$query = "SELECT * FROM `user_location` WHERE (".$user_lat." - latitude) <= 1 AND (".$user_lon." - longitude) <= 1 LIMIT 100"; 

これを10,000行でテストしたところ、3秒弱で私の近くの254人でした。 (ランダムに生成されたコンテンツ)

+0

ありがとう、しかし私は正確な距離が必要です。私のデータベースに1 000 000点以上あり、それを0.00x秒まで計算する必要があります。そして、私は1分ごとにXXXXデータをインポートしているので、 "挿入"するたびに各行を更新することはできません。しかし、他の人のための素晴らしい解決策:-) –

+0

あなたは距離を計算して番号を変更することができます。しかし、彼らのポジションが最新である場合にのみ正確です。私はあなたの近くにいる人々(囁きのようなもの)を見つけるためにアプリに使った。個人的に私は30分ごとにログインして再接続するたびに更新しました。だから、まだまだ狂ったトラフィックはまったくまともではありませんでした。私はこれを1都市ブロック内の人を特定することができました。私はちょうど緯度/経度で1マイル/フィート/メートルの配分を知らないのです。 –

関連する問題