3

与えられたのは、300,000 件のテスト レコードを含むテーブルです。

次のような選択を行う必要があります。

SELECT (SQRT(POWER(ABS(posts.latitude-$lat),2)+POWER(ABS(posts.longitude-$lng),2))) AS distance
FROM table
ORDER BY distance
LIMIT 0,50

$lat と $lng はリクエストごとに変わります。どうすればそのようなクエリを高速化できますか?

ありがとう。

4

2 に答える 2

1

実際には、そのクエリを最適化することはできません。

計算値を使用して結果を並べ替えているため、インデックスを使用できません。を使用explainすると、クエリがどのように実行されているかを確認できusing temporaryextra列に表示されます。これは、クエリのすべてのデータが、順序付けが実行される一時テーブルに保存されていることを意味します。

クエリの最初の50一致のみが必要かどうかは関係ありません。最初にすべてのデータを取得し、それを一時テーブルにダンプし、そのテーブルで結果を並べ替えてから、最初の50一致を返す必要があります。

ご想像のとおり、これは時間とメモリを消費する操作です。

したがって、最良のオプションは、テーブルにインデックスを配置して、必要なすべての行をできるだけ速く取得し、それらを処理してphp必要なデータを取得することです。

ちなみに、MySQL最適化ガイドをご覧ください。

于 2013-03-09T14:14:27.033 に答える
-1

$userParam の列をインデックスにすると、クエリの実行速度が向上します。または、インデックス付きビューを作成することもできます: http://www.codeproject.com/Articles/199058/SQL-Server-Indexed-Views-Speed-Up-Your-Select-Quer

お役に立てれば

于 2013-03-08T14:38:20.493 に答える