When I add LIMIT 1 to a MySQL query, does it stop the search after it finds 1 result (thus making it faster) or does it still fetch all of the results and truncate at the end?
5 に答える
クエリによっては、制限句を追加すると、パフォーマンスに大きな影響を与える可能性があります。行が 1 つだけ必要な場合 (またはクエリを満たすことができるのは 1 行だけであることがわかっている場合) で、内部オプティマイザーがそれを実行する方法がわからない場合 (たとえば、WHERE 句がインデックスにヒットしないなど)、必ず LIMIT 句を追加する必要があります。
最適化されたクエリ (小さなテーブルでインデックスを使用) に関しては、おそらくパフォーマンスにはあまり影響しませんが、1 行だけに関心がある場合は、LIMIT 句を追加するよりも重要です。
制限はクエリのパフォーマンスに影響を与える可能性があり (以下のコメントとリンクを参照)、MySQL によって出力される結果セットも減少します。単一の結果が期待されるクエリの場合、利点があります。
さらに、結果セットを制限すると、大きな結果セットを転送するとメモリが使用され、ディスク上に一時テーブルが作成される可能性があるため、実際には合計クエリ時間が短縮されます。私は最近、制限を使用しないアプリケーションが大量の結果セットのためにサーバーを強制終了し、制限を適用するとリソースの使用率が大幅に低下するのを見たので、これについて言及します。
詳細については、このページを確認してください: MySQL ドキュメント: LIMIT 最適化
返される結果が 1 つしかない場合は、いいえ、LIMIT を使用してもそれ以上速くなることはありません。多くの結果があり、最初の結果のみが必要で、GROUP または ORDER by ステートメントがない場合は、LIMIT を使用すると高速になります。
要するに、答えはイエスです。結果を 1 に制限すると、1 つの結果を「期待」していても、データベースはすべてのレコードを調べないため、クエリは高速になります。クエリに一致するレコードが見つかると、単純に停止します。
本当に 1 つの結果しか期待できない場合は、クエリに LIMIT を追加するのが理にかなっています。MySQL の内部の仕組みはわかりませんが、最後に 1 に切り詰めるためだけに 100,000 件以上のレコードの結果セットを収集することはないと確信しています..