2016-08-31 7 views
0

私は約50,000レコードのテーブルで実行されている次のMYSQLクエリを持っています。クエリは半径20マイル以内のレコードを返しています。レコードを絞り込むためにwhere句にバウンディングボックスを使用しています。クエリーは距離でソートされ、10ページのレコードに制限されます。ページングされたページで使用されるためです。MYSQLクエリのパフォーマンス - 距離による検索

クエリは現在平均0.0210秒で完了していますが、ウェブサイトが非常に忙しいので、これを改善する方法を探しています。

advertsテーブルには約20個のカラムがあり、経度と緯度カラムのインデックスがあります。

とにかくこのクエリのパフォーマンスを向上させる誰も見ることができますか?私はちょうどadvert_idと経度と緯度のフィールドを持っている別のテーブルを作成することを考えていたが、誰か他の提案や以下のクエリを改善する方法があった疑問に思っていた?

SELECT adverts.advert_id, 
     round(sqrt((((adverts.latitude - '52.536320') * 
      (adverts.latitude - '52.536320')) * 69.1 * 69.1) + 
      ((adverts.longitude - '-2.063380') * 
      (adverts. longitude - '-2.063380') * 53 * 53)), 
      1) as distance FROM adverts 
    WHERE (adverts.latitude BETWEEN 52.2471737281 AND 52.8254662719) 
     AND (adverts.longitude BETWEEN -2.53875093307 AND -1.58800906693) 
    having (distance <= 20) 
    ORDER BY distance ASC 
    LIMIT 10 

答えて

0

空間データフォーマットと空間インデックス:how to use themを使用する必要があります。

特に、緯度と経度の両方を単一の列に格納するためにPOINTデータ形式を使用し、その列に空間インデックスを追加する必要があります。

空間インデックスは、通常、Rツリー(または派生)として実装されているため、特定の領域内のすべてのポイントを検索するコストは対数です。

+0

'SHOW CREATE TABLE'を見てみましょう。どのバージョンのMySQL? –

+0

@RickJames上記のドキュメントはmysql 5.7を参照しているので、少なくともそれはそれ以降のすべてのバージョンで動作します(ただし、古いバージョンのほとんどの機能を覚えています)。 [there](https://dev.mysql.com/doc/refman/5.7/en/creating-spatial-indexes.html)には、create tableの良い例があり、そこには空間インデックスも追加されています。 GEOMETRYをPOINTに置き換えるだけです。その場合、作成される唯一の列も主キーです。重複したポイントを保存する場合は、明らかに主キーとして使用する別の列を追加する必要があります。 –

+0

おっと、私はおそらく@マークのための私の質問を意味しました。 –

関連する問題