2008-08-29 4 views
24

Wird eine Abfrage auf einen Ergebnisdatensatz beschränkt, die Leistung in einer großen (ish) MySQL-Tabelle verbessert, wenn die Tabelle nur ein übereinstimmendes Ergebnis enthält?Verbessert die Einschränkung einer Abfrage auf einen Datensatz die Leistung

zum Beispiel

select * from people where name = "Re0sless" limit 1 

, wenn es mit diesem Namen nur einen Datensatz ist? und was wäre, wenn name der Primärschlüssel/Set zu einzigartig wäre? und lohnt es sich, die Abfrage zu aktualisieren oder wird der Gewinn minimal sein?

Antwort

35

Wenn die Spalte

einen eindeutigen Index: nein, ist es keine schnelle

ein nicht-eindeutiger Index: vielleicht,, weil es verhindert, alle zusätzliche Zeilen über die ersten abgestimmt senden, sofern vorhanden

keinen Index: manchmal

  • Wenn 1 oder mehr Zeilen mit der Abfrage übereinstimmen, ja, weil der vollständige Tabellenscan angehalten wird, nachdem die erste Zeile abgeglichen wurde.
  • , wenn keine Zeilen der Abfrage entsprechen, keine, denn es muss eine vollständige Tabelle
+2

Wird ein vollständiger Tabellenscan verhindert, oder wird der gesamte Tabellenscan vorzeitig beendet? Wenn der Datensatz nicht vorhanden ist, muss immer noch ein vollständiger, vollständiger Tabellenscan durchgeführt werden. –

+2

Ja, Sie haben Recht. Es sollte gesagt haben, dass es einen vollständigen Tabellenscan verhindern kann. Ich werde den Beitrag anpassen –

+4

Die wichtige Sache hier, wie ich es verstehe, ist, dass das Hinzufügen der Grenze Ihre Abfrage schneller machen könnte, aber es wird es nicht langsamer machen. Wenn es nichts anderes ist, dient es auch dazu, Ihre Absicht zukünftigen Entwicklern klar zu vermitteln, falls sie eine Situation debuggen müssen, in der Ihre Bedingungen nicht so einzigartig waren, wie Sie es dachten. Ich mache es mir zur Gewohnheit, immer eine Limit-Klausel hinzuzufügen, wenn ich nur ein Ergebnis habe. Es ist nur verschwendete Intelligenz, um herauszufinden, ob ein bereits bestehender Index das für Sie bereits getan hätte. – GrandOpener

0

Ich glaube, dass die LIMIT ist etwas getan, nachdem der Datensatz gefunden und die Ergebnismenge aufgebaut wird, so würde ich nicht erwarten, dass es überhaupt einen Unterschied machen. Der Name als Primärschlüssel hat jedoch einen signifikant positiven Effekt, da er zu einem Index für die Spalte führt.

0

Wenn „name“ ist einzigartig in der Tabelle vervollständigen scannen, dann kann es noch eine (sehr sehr minimal sein) Leistungssteigerung durch Setzen der Limit-Einschränkung auf Ihre Anfrage. Wenn name der Primärschlüssel ist, wird es wahrscheinlich keinen geben.

2

Um Ihre Fragen in der Reihenfolge zu beantworten: 1) Ja, wenn es keinen Index auf Name gibt. Die Abfrage wird beendet, sobald der erste Datensatz gefunden wird. nehmen Sie das Limit ab und es muss jedes Mal eine vollständige Tabelle gescannt werden. 2) nein. primäre/eindeutige Schlüssel sind garantiert einzigartig. Die Abfrage sollte nicht mehr ausgeführt werden, sobald sie die Zeile gefunden hat.

0

Ja, Sie werden einen Leistungsunterschied feststellen, wenn Sie mit den Daten arbeiten. Ein Datensatz belegt weniger Speicherplatz als mehrere Datensätze. Wenn Sie nicht mit vielen Zeilen arbeiten, ist dies kein großer Unterschied, aber sobald Sie die Abfrage ausführen, müssen die Daten Ihnen angezeigt werden, was kostspielig ist oder programmgesteuert erfolgt. So oder so, ein Datensatz ist einfacher als mehrere.

3

Wenn Sie eine etwas kompliziertere Abfrage mit einem oder mehreren Joins haben, gibt die LIMIT-Klausel dem Optimierer zusätzliche Informationen. Wenn es erwartet, zwei Tabellen übereinzustimmen und alle Zeilen zurückzugeben, ist hash join normalerweise optimal. Ein Hash-Join ist eine Join-Art, die für große Übereinstimmungsmengen optimiert ist.

Wenn das Optimierungsprogramm jetzt weiß, dass Sie LIMIT 1 überschritten haben, weiß es, dass es keine großen Datenmengen verarbeiten wird. Es kann zu loop join zurückkehren.

Basierend auf der Datenbank (und sogar der Datenbankversion) kann dies einen großen Einfluss auf die Leistung haben.