クエリに LIMIT 1 を追加すると処理が高速化されるかどうか疑問に思っていましたか?
例えば...
ほとんどの場合、1 つの結果を返すクエリがありますが、10、100、または 1000 のレコードを返すこともあります。しかし、私が欲しいのは最初のレコードだけです。
リミット 1 は速度を上げますか、それとも違いはありませんか?
GROUP BY を使用して 1 つの結果を返すことができることはわかっていますが、それでは計算が増えるだけです。
クエリに LIMIT 1 を追加すると処理が高速化されるかどうか疑問に思っていましたか?
例えば...
ほとんどの場合、1 つの結果を返すクエリがありますが、10、100、または 1000 のレコードを返すこともあります。しかし、私が欲しいのは最初のレコードだけです。
リミット 1 は速度を上げますか、それとも違いはありませんか?
GROUP BY を使用して 1 つの結果を返すことができることはわかっていますが、それでは計算が増えるだけです。
ORDER BY があるかどうかによって異なります。いずれにせよ、ORDER BY は結果セット全体を必要とするため、並べ替えることができます。
ORDER BY がない場合は、より高速に実行されるはずです。
もちろん、結果セット全体を送信する必要はないため、すべての場合で少なくとも少し速く実行されます。
うん!そうなる!
しかし、確かに、'Limit 1' を SQL ステートメントの最後に追加するのに 1 秒しかかからないはずなので、試してみませんか?
それはすべてクエリ自体に依存します。インデックス付きのルックアップ (Where indexedColumn = somevalue) またはインデックス付きの列の並べ替え (Where 句なし) を実行している場合、制限 1 により実際に速度が向上します。結合または複数の where/order 句がある場合、物事は非常に複雑になります。ただし、「LIMIT 1」を使用してもクエリの速度が低下することはありません。速度が上がることもありますが、遅くなることはありません。
ここで、PHP を扱うときに別の問題があります。デフォルトでは、PHP はクエリから戻る前に結果セット全体をバッファリングします (mysql_query または mysqli->query は、すべてのレコードがダウンロードされた後にのみ返されます)。そのため、クエリ時間は制限 1 によってほとんど変化しない可能性がありますが、PHP が結果をバッファリングするために使用する時間とメモリは重要です。各行に 200 バイトのデータがあるとします。これで、クエリは 10,000 行を返します。つまり、PHP は、決して使用しない追加の 2 MB のメモリ (実際には、PHP の変数構造のオーバーヘッドで 10 MB 近く) を割り当てる必要があります。メモリの割り当てには非常にコストがかかる可能性があるため、一般的なルールは、必要なもの (または必要になると思われるもの) だけを割り当てることです。1 行だけが必要なときに 10,000 行をダウンロードするのは無駄です。
これら 2 つの効果を組み合わせると、1 行だけが必要な場合に常に「LIMIT 1」を使用する必要がある理由がわかります。
これが LIMIT 句の実際の基本的な目的です:P 必要な結果の数がわかっている場合は、常にその数を LIMIT として指定する必要があります。これは、より高速であるという理由だけでなく (ORDER BY を実行している場合を除きます)、より多くの結果を得るためにも必要です。 PHP スクリプトのメモリを効率的に使用できます。
注: タグに PHP を追加したので、PHP で MySQL を使用していると思います。MySQL から直接 (スクリプト言語の外部で) 選択するだけの場合、ORDER BY を使用するときに LIMIT を使用する利点は、純粋に結果を管理しやすくすることです。
これは、MySQL サイトからの主題に関するいくつかの関連ドキュメントです。
クエリの他の部分に応じて、さまざまな方法で高速化できるようです。ORDER
or句がない場合に役立つかどうかはわかりませんが、GROUP
すべてHAVING
の結果行を返すのではなく、すぐに停止できることを除けば (100,000 レコードを返す場合は、十分に高速になる可能性があります)。