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


86

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


1
フィルタ列にUNIQUE(またはPRIMARY KEY)制約(またはインデックス)がある場合はそうではありません。stackoverflow.com/questions/8467092/...
ma11hew28

回答:


81

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

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


30
バグ防止の目的で、LIMIT 2を送信することを検討し、単一行の仮定が当てはまらない場合は、文句を言うか爆撃することをお勧めします。
ジェフリーハンティン2009年

6
@JeffreyHantin本当に1つしかない場合は、データベースに一意の制約を追加することをお勧めします。その後、サニティチェックでコードをめちゃくちゃにします。
Cristian Vrabie 2013

@CristianVrabie一意の制約として表現できる場合は確かですが、それはテーブル内のデータに関するアサーションです。LIMIT 2を送信して1をチェックすることは、クエリ自体に関するアサーションです。これには、不適切に指定された結合条件などのバグが含まれている可能性があります。
ジェフリーハンティン2013

1
@JeffreyHantin十分に公平ですが、火星探査車用にコーディングする場合を除いて、コードを汚染するのではなく、このためのテストを作成します。
Cristian Vrabie 2013

8
@JeffreyHantin 1つしかないという仮定が正しい場合、LIMIT 2を追加すると、すべての行が検索されるため、最適化が無効になりませんか?その場合にLIMIT2を追加することは、何も追加しないことよりも(最適化に関して)優れているわけではありません。
クリスミドルトン

19

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

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

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


リンクしたページには、「LIMITを使用して数行のみを選択している場合、MySQLは、通常は全表スキャンを実行したい場合にインデックスを使用することがあります」と書かれています。これは、クエリ自体が常に通常どおりに処理されるようには見えません。
che

いい視点ね。EXPLAINを使った観察に基づいて一般化を行っていました。キャッチしてくれてありがとう。
rjamestaylor 2009年

リンクは大歓迎です。FWIW、この回答のほとんどは、制限がないと、大きな結果セットが存在する可能性がある状況に当てはまるようです。問題は、1行だけが正常に一致する場合に重要かどうかを尋ねることです。この場合、「結果セット」は1行のみです(制限がない場合でも)。
ToolmakerSteve

5

返される結果が1つしかない場合は、いいえ、LIMITはそれ以上速くなりません。結果がたくさんあり、最初の結果だけが必要で、GROUPまたはORDER byステートメントがない場合、LIMITを使用すると結果が速くなります。


2
一意のキー/主キーがない場合は、最初の出現が
見つかっ

クリス、あなたの最初の文は2つの方法のうちの1つを読むことができます。「1行しか返されない可能性がある」(たとえば、一意の列をクエリする)という意味の場合、あなたの言うことは真実です。OTOH、「一致する結果が1つだけ見つかった場合」という意味の場合、制限によって高速化されるわけではありません。よろしいですか?追加のページを取得する必要がない場合がありますか?
ToolmakerSteve

5

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


1
この回答は誤解を招く可能性があります。他の回答(7年前!)のコメントに見られる警告がないためです。DBが1つのレコードのみが一致する可能性があることを知っている場合(たとえば、一意の列のクエリ)、制限1は効果がありません。
ToolmakerSteve

真剣に?クエリオプティマイザは、特定の条件があるという事実を利用することができます保証する唯一の1レコードはおそらく返すことができるという。私はあなたの答えがすべての状況下で正しいわけではないことを指摘していました。(したがって、何年も前にすでに言われたことから価値を差し引きます。)同意する場合は、私のコメントの正しさを認めることができます。同意しない場合は、その理由を明確にすることができます。
ToolmakerSteve

1

本当に1つの結果しか期待できない場合は、クエリにLIMITを追加するのが理にかなっています。MySQLの内部動作はわかりませんが、最後に1に切り捨てるためだけに、100,000以上のレコードの結果セットを収集することはないと確信しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.