Frage

Verbessert die Beschränkung einer Abfrage auf einen Ergebnisdatensatz die Leistung in einer großen MySQL-Tabelle, wenn die Tabelle nur ein passendes Ergebnis hat?

Zum Beispiel

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

wenn es nur einen Datensatz mit diesem Namen gibt?und was wäre, wenn name War der Primärschlüssel/auf eindeutig gesetzt?Und lohnt es sich, die Abfrage zu aktualisieren, oder wird der Gewinn minimal sein?

War es hilfreich?

Lösung

Wenn die Spalte hat

ein eindeutiger Index:NEIN, es geht nicht schneller

ein nicht eindeutiger Index:Vielleicht, weil dadurch verhindert wird, dass über die ersten übereinstimmenden Zeilen hinaus weitere Zeilen gesendet werden, sofern welche vorhanden sind

kein Index:Manchmal

  • wenn eine oder mehrere Zeilen mit der Abfrage übereinstimmen, Ja, da der vollständige Tabellenscan angehalten wird, nachdem die erste Zeile abgeglichen wurde.
  • Wenn keine Zeilen mit der Abfrage übereinstimmen, NEIN, da ein vollständiger Tabellenscan durchgeführt werden muss

Andere Tipps

Wenn Sie eine etwas kompliziertere Abfrage mit einem oder mehreren Joins haben, liefert die LIMIT-Klausel dem Optimierer zusätzliche Informationen.Wenn erwartet wird, dass zwei Tabellen übereinstimmen und alle Zeilen zurückgegeben werden, a Hash-Join ist typischerweise optimal.Ein Hash-Join ist ein Join-Typ, der für große Übereinstimmungsmengen optimiert ist.

Wenn der Optimierer nun weiß, dass Sie LIMIT 1 überschritten haben, weiß er, dass er keine großen Datenmengen verarbeiten wird.Es kann zu einem zurückkehren Schleifenverknüpfung.

Abhängig von der Datenbank (und sogar der Datenbankversion) kann dies große Auswirkungen auf die Leistung haben.

Um Ihre Fragen der Reihe nach zu beantworten:1) Ja, wenn kein Index zum Namen vorhanden ist.Die Abfrage wird beendet, sobald der erste Datensatz gefunden wird.Wenn Sie das Limit aufheben, muss jedes Mal ein vollständiger Tabellenscan durchgeführt werden.2) nein.Primäre/eindeutige Schlüssel sind garantiert eindeutig.Die Abfrage sollte nicht mehr ausgeführt werden, sobald sie die Zeile findet.

Ich glaube, dass LIMIT etwas ist, das gemacht wird, nachdem der Datensatz gefunden wurde und der Ergebnissatz aufgebaut wird, also würde ich nicht erwarten, dass es überhaupt einen Unterschied macht.Die Festlegung des Namens als Primärschlüssel hat jedoch einen deutlich positiven Effekt, da dadurch ein Index für die Spalte erstellt wird.

Wenn „name“ in der Tabelle eindeutig ist, kann es dennoch zu einem (sehr, sehr minimalen) Leistungsgewinn kommen, wenn Sie die Einschränkung „Limit“ auf Ihre Abfrage anwenden.Wenn Name der Primärschlüssel ist, wird es wahrscheinlich keinen geben.

Ja, Sie werden einen Leistungsunterschied beim Umgang mit den Daten bemerken.Ein Datensatz nimmt weniger Platz ein als mehrere Datensätze.Sofern Sie es nicht mit vielen Zeilen zu tun haben, würde dies keinen großen Unterschied machen, aber sobald Sie die Abfrage ausführen, müssen Ihnen die Daten wieder angezeigt werden, was kostspielig ist oder programmgesteuert verarbeitet werden muss.In jedem Fall ist ein Datensatz einfacher als mehrere.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top