MIN / MAX vs ORDER BY und LIMIT

99

Welche Methode würden Sie aus den folgenden Abfragen als die bessere betrachten? Was sind Ihre Gründe (Code-Effizienz, bessere Wartbarkeit, weniger WTFery) ...

SELECT MIN(`field`)
FROM `tbl`;

SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;
nickf
quelle

Antworten:

125

Im schlimmsten Fall, wenn Sie ein nicht indiziertes Feld betrachten, MIN()erfordert die Verwendung einen einzigen vollständigen Durchlauf der Tabelle. Verwenden SORTund LIMITerfordert eine Dateisortierung. Wenn Sie gegen einen großen Tisch laufen, gibt es wahrscheinlich einen signifikanten Unterschied in der wahrgenommenen Leistung. Als bedeutungsloser Datenpunkt MIN()dauerte es 0,36 Sekunden SORTund LIMIT0,84 Sekunden für eine 106.000-Zeilen-Tabelle auf meinem Entwicklungsserver.

Wenn Sie jedoch eine indizierte Spalte betrachten, ist der Unterschied schwerer zu bemerken (der bedeutungslose Datenpunkt beträgt in beiden Fällen 0,00 s). Wenn man sich die Ausgabe von EXPLAIN ansieht, sieht es jedoch so aus, als könnte MIN()man einfach den kleinsten Wert aus dem Index (Zeilen "Ausgewählte Tabellen auswählen" und "NULL") abrufen, während das SORTund LIMITnoch eine geordnete Durchquerung des Index durchführen muss (106.000 Zeilen). Die tatsächlichen Auswirkungen auf die Leistung sind wahrscheinlich vernachlässigbar.

Es sieht so aus, als wäre MIN()es der richtige Weg - es ist im schlimmsten Fall schneller, im besten Fall nicht zu unterscheiden, es ist Standard-SQL und drückt am deutlichsten den Wert aus, den Sie erreichen möchten. Der einzige Fall, in dem die Verwendung von SORTund LIMITwünschenswert erscheint, ist, wie bereits erwähnt, der Fall , in dem Sie eine allgemeine Operation schreiben, bei der die oberen oder unteren N-Werte aus beliebigen Spalten ermittelt werden, und es sich nicht lohnt, die Sonderfalloperation aufzuschreiben .

Sean McSomething
quelle
7
o (n) für einen einzelnen Durchgang vs 0 (nlogn) zum Sortieren
Abhishek Iyer
1
@AbhishekIyer Sie haben völlig Recht, aber ich würde hinzufügen "im schlimmsten Fall für nicht indizierte Felder".
Dmikam
Dieser Teil über den schlimmsten nicht indizierten Fall ist falsch. Sie benötigen immer einen vollständigen Scan. Woher wissen Sie sonst, dass es sich um ein Minimum oder ein Maximum handelt? Es ist nicht so, als würden Sie scannen und der Wert schreit: "Hey, du hast mich endlich gefunden! Ich bin Jack, der Max!".
Robo Robok
In einem Test mit einer indizierten Tabelle mit 470 Millionen Zeilen dauern beide Abfragen 0,00 s. Wenn wir den Abfragen jedoch einen Filter "WHERE field2 = x" hinzufügen, dauert die Abfrage mit LIMIT immer noch 0,00 s und die Abfrage mit MIN 0,21 s.
Antonio Cañas Vargas
12
SELECT MIN(`field`)
FROM `tbl`;

Einfach weil es ANSI-kompatibel ist. Limit 1 gilt speziell für MySQL, ebenso wie TOP für SQL Server.

Otávio Décio
quelle
Die meisten DBMS haben Limit / Offset oder Äquivalent und es wird in den meisten Apps verwendet, an denen ich gearbeitet habe (nicht als Alternative zu MIN, sondern für andere Zwecke wie Paginierung)
finnw
@finnw - Ich stimme zu, aber das Beispiel des Fragestellers war der explizite Vergleich des Grenzwerts mit min.
Otávio Décio
9

Wie mson und Sean McSomething betont haben, ist MIN vorzuziehen.

Ein weiterer Grund, warum ORDER BY + LIMIT nützlich ist, ist, wenn Sie den Wert einer anderen Spalte als der MIN-Spalte abrufen möchten.

Beispiel:

SELECT some_other_field, field
FROM tbl
ORDER BY field
LIMIT 1
user650654
quelle
4

Ich denke, die Antworten hängen davon ab, was Sie tun.

Wenn Sie eine 1-Aus-Abfrage haben und die Absicht so einfach ist, wie Sie angegeben haben, ist die Auswahl von min (Feld) vorzuziehen.

Es ist jedoch üblich, dass sich diese Arten von Anforderungen in Top-N-Ergebnisse, N-N-M-Ergebnisse usw. ändern.

Ich denke nicht, dass es eine zu schreckliche Idee ist, sich auf die von Ihnen gewählte Datenbank festzulegen. Das Ändern von DBS sollte nicht leichtfertig vorgenommen werden und muss den Preis, den Sie bei diesem Schritt zahlen, ändern.

Warum beschränken Sie sich jetzt auf Schmerzen, die Sie später möglicherweise spüren oder nicht?

Ich denke, es ist gut, ANSI so weit wie möglich zu bleiben, aber das ist nur eine Richtlinie ...

mson
quelle
3

Bei akzeptabler Leistung würde ich die erste verwenden, da sie der Absicht semantisch näher kommt.
Wenn die Leistung ein Problem wäre (die meisten modernen Optimierer optimieren wahrscheinlich beide auf denselben Abfrageplan, obwohl Sie testen müssen, um dies zu überprüfen), würde ich natürlich den schnelleren verwenden.

Charles Bretana
quelle