Werden sie durch Hinzufügen von 'LIMIT 1' zu MySQL-Abfragen schneller, wenn Sie wissen, dass nur 1 Ergebnis erzielt wird?

84

Wenn ich einer MySQL-Abfrage LIMIT 1 hinzufüge, stoppt es die Suche, nachdem es 1 Ergebnis gefunden hat (wodurch es schneller wird), oder ruft es immer noch alle Ergebnisse ab und schneidet sie am Ende ab?

Logan Serman
quelle
1
Nicht, wenn die Filterspalte eine UNIQUE(oder PRIMARY KEY) Einschränkung (oder einen Index) aufweist. stackoverflow.com/questions/8467092/…
ma11hew28

Antworten:

80

Abhängig von der Abfrage kann das Hinzufügen einer Limit-Klausel einen großen Einfluss auf die Leistung haben. Wenn Sie nur eine Zeile möchten (oder wissen möchten, dass nur eine Zeile die Abfrage erfüllen kann) und nicht sicher sind, wie der interne Optimierer sie ausführen wird (z. B. WHERE-Klausel, die keinen Index trifft usw.), dann Sie sollten auf jeden Fall eine LIMIT-Klausel hinzufügen.

Bei optimierten Abfragen (unter Verwendung von Indizes für kleine Tabellen) spielt die Leistung wahrscheinlich keine große Rolle, aber auch hier gilt: Wenn Sie nur an einer Zeile interessiert sind, fügen Sie trotzdem eine LIMIT-Klausel hinzu.

Eran Galperin
quelle
30
Für Antibugging-Zwecke sollten Sie LIMIT 2 senden und sich dann beschweren oder bombardieren, wenn Ihre einreihige Annahme nicht zutrifft.
Jeffrey Hantin
6
@ JeffreyHantin Wenn es wirklich nur eine geben kann, sollten Sie es vorziehen, der Datenbank eine eindeutige Einschränkung hinzuzufügen. Viel sauberer, als Ihren Code mit Sanity Checks durcheinander zu bringen.
Cristian Vrabie
@CristianVrabie Wenn es als eindeutige Einschränkung ausgedrückt werden kann, sicher, aber das ist eine Aussage über die Daten in den Tabellen. Das Senden von LIMIT 2 und das Überprüfen auf 1 ist eine Aussage über die Abfrage selbst, die möglicherweise einen Fehler enthält, z. B. eine unzureichend angegebene Verknüpfungsbedingung.
Jeffrey Hantin
1
@ JeffreyHantin Fair genug, aber außer wenn Sie für den Mars Rover codieren, schreiben Sie Tests dafür, anstatt Ihren Code zu verschmutzen.
Cristian Vrabie
8
@JeffreyHantin Wenn die Annahme, dass es nur eine gibt, richtig ist, würde das Hinzufügen von LIMIT 2 nicht eine Optimierung zunichte machen, da alle Zeilen durchsucht würden? Das Hinzufügen von LIMIT 2 ist in diesem Fall nicht besser (in Bezug auf die Optimierung) als das Hinzufügen von gar nichts.
Chris Middleton
19

Das Limit kann die Leistung der Abfrage beeinträchtigen (siehe Kommentare und den folgenden Link) und die von MySQL ausgegebene Ergebnismenge reduzieren. Für eine Abfrage, bei der Sie ein einzelnes Ergebnis erwarten, ergeben sich Vorteile.

Darüber hinaus kann die Begrenzung der Ergebnismenge die Gesamtabfragezeit beschleunigen, da beim Übertragen großer Ergebnismengen Speicher verwendet wird und möglicherweise temporäre Tabellen auf der Festplatte erstellt werden. Ich erwähne dies, da ich kürzlich eine Anwendung gesehen habe, die aufgrund großer Ergebnismengen kein Limit-Kill-System verwendet hat und bei vorhandenem Limit die Ressourcennutzung enorm gesunken ist.

Weitere Einzelheiten finden Sie auf dieser Seite: MySQL-Dokumentation: LIMIT-Optimierung

rjamestaylor
quelle
Auf der von Ihnen verlinkten Seite heißt es: "Wenn Sie mit LIMIT nur wenige Zeilen auswählen, verwendet MySQL in einigen Fällen Indizes, wenn normalerweise ein vollständiger Tabellenscan bevorzugt wird." Das sieht nicht so aus, als würde die Abfrage selbst immer wie gewohnt verarbeitet.
Che
guter Punkt. Ich habe eine Verallgemeinerung gemacht, die auf Beobachtungen aus EXPLAIN basiert. Danke für den Fang.
rjamestaylor
Der Link wird sehr geschätzt. FWIW, der größte Teil dieser Antwort scheint auf Situationen zuzutreffen, in denen es ohne Limit möglicherweise eine große Ergebnismenge gibt . Die Frage ist, ob es wichtig ist, wenn nur eine Zeile jemals erfolgreich übereinstimmt. In diesem Fall ist die "Ergebnismenge" nur 1 Zeile (auch ohne Limit).
ToolmakerSteve
5

Wenn nur 1 Ergebnis zurückkommt, wird LIMIT es nicht schneller machen. Wenn es viele Ergebnisse gibt und Sie nur das erste Ergebnis benötigen und es keine GROUP- oder ORDER by-Anweisungen gibt, wird es durch LIMIT schneller.

Kris Erickson
quelle
2
Es sollte sogar mit 1 Zeile schneller sein, wenn es keine eindeutigen / Primärschlüssel gibt, da es die Suche beendet, nachdem es das erste Vorkommen gefunden hat
the_nuts
Kris, dein erster Satz kann auf zwei Arten gelesen werden. Wenn Sie meinen, dass möglicherweise nur eine Zeile zurückgegeben werden könnte (z. B. eine eindeutige Spalte abfragen), ist das, was Sie sagen, wahr. OTOH, wenn Sie das Limit "Immer wenn nur 1 übereinstimmendes Ergebnis gefunden wird" meinen, wird es nicht schneller: Sind Sie sicher? Vermeidet es nicht manchmal, zusätzliche Seiten einziehen zu müssen?
ToolmakerSteve
5

Kurz gesagt lautet die Antwort ja. Wenn Sie Ihr Ergebnis auf 1 beschränken, ist die Abfrage auch dann schneller, wenn Sie ein Ergebnis "erwarten", da Ihre Datenbank nicht alle Ihre Datensätze durchsucht. Es wird einfach angehalten, sobald ein Datensatz gefunden wurde, der Ihrer Abfrage entspricht.

Max Alexander Hanna
quelle
1
Diese Antwort ist irreführend, da es an der Einschränkung mangelt, die in Kommentaren zu anderen Antworten (7 Jahre zuvor!) Zu sehen ist, dass Limit 1 keine Auswirkung hat, wenn die DB weiß, dass möglicherweise nur ein Datensatz übereinstimmen kann (z. B. das Abfragen einer eindeutigen Spalte).
ToolmakerSteve
Ernsthaft? Das Abfrageoptimierungsprogramm kann die Tatsache nutzen, dass bestimmte Bedingungen garantieren, dass möglicherweise nur 1 Datensatz zurückgegeben werden kann. Ich habe darauf hingewiesen, dass Ihre Antwort nicht unter allen Umständen richtig ist. (Und subtrahiert daher den Wert von dem, was bereits Jahre zuvor gesagt wurde.) Wenn Sie zustimmen, können Sie die Richtigkeit meines Kommentars anerkennen. Wenn Sie nicht einverstanden sind, können Sie klären, warum.
ToolmakerSteve
1

Wenn Sie wirklich nur ein einziges Ergebnis erwarten, ist es wirklich sinnvoll, das LIMIT an Ihre Abfrage anzuhängen. Ich kenne das Innenleben von MySQL nicht, aber ich bin sicher, dass es keine Ergebnismenge von über 100'000 + Datensätzen sammelt, nur um es am Ende wieder auf 1 zu kürzen.

driAn
quelle