web-dev-qa-db-ja.com

MySQLクエリに「LIMIT 1」を追加すると、結果が1つしかないことがわかっている場合に、より高速になりますか?

MySQLクエリにLIMIT 1を追加すると、1つの結果が見つかった後に検索を停止します(したがって、高速化します)か、それでもすべての結果をフェッチし、最後に切り捨てますか?

80
Logan Serman

クエリによっては、制限句を追加するとパフォーマンスに大きな影響を与える可能性があります。 1行のみが必要な場合(または1行のみがクエリを満たすことができるという事実を知っている場合)、内部オプティマイザーがどのように実行するかが不明な場合(たとえば、WHERE句がインデックスにヒットしないなど)、必ずLIMIT句を追加する必要があります。

最適化されたクエリ(小さなテーブルでインデックスを使用する)に関しては、おそらくパフォーマンスにはさほど重要ではありませんが、1行のみに関心がある場合は、LIMIT句を追加しても関係ありません。

73
Eran Galperin

制限は、クエリのパフォーマンスに影響を与える可能性があり(コメントと以下のリンクを参照)、MySQLによって出力される結果セットも削減します。単一の結果を期待するクエリには利点があります。

さらに、結果セットを制限すると、大きな結果セットを転送するとメモリを使用し、ディスク上に一時テーブルを作成する可能性があるため、実際には合計クエリ時間を短縮できます。私は最近、制限を使用していないアプリケーションが巨大な結果セットのためにサーバーを殺すのを見たので、リソースの使用率が大幅に低下しました。

詳細については、このページを確認してください。 MySQLドキュメント:LIMIT Optimization

18
rjamestaylor

戻ってくる結果が1つしかない場合、いいえ、LIMITはそれを速くしません。多数の結果があり、最初の結果のみが必要で、GROUPまたはORDER BYステートメントがない場合、LIMITはそれを高速化します。

4
Kris Erickson

要するに、答えはイエスです。結果を1に制限すると、1つの結果を「期待」している場合でも、データベースはすべてのレコードを調べないため、クエリは高速になります。クエリに一致するレコードが見つかると停止します。

3

単一の結果のみが必要な場合は、クエリにLIMITを追加するのが理にかなっています。 MySQLの内部動作はわかりませんが、最後に1に切り捨てるためだけに100'000 +レコードの結果セットを収集しないと確信しています。

1
driAn