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