it-swarm.com.de

MIN / MAX vs ORDER BY und LIMIT

Welche der folgenden Abfragen würden Sie 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;
83
nickf

Im schlimmsten Fall, wenn Sie ein nicht indiziertes Feld betrachten, erfordert die Verwendung von MIN() einen einzelnen vollständigen Durchlauf der Tabelle. Die Verwendung von SORT und LIMIT erfordert eine Dateisortierung. Bei einer Ausführung an einem großen Tisch würde sich die wahrgenommene Leistung wahrscheinlich erheblich unterscheiden. Als bedeutungsloser Datenpunkt hat MIN() .36s gedauert, während SORT und LIMIT .84s für eine 106.000-Zeilentabelle auf meinem Entwickler-Server gedauert haben.

Wenn Sie sich jedoch eine indizierte Spalte ansehen, ist der Unterschied schwerer zu bemerken (bedeutungsloser Datenpunkt ist in beiden Fällen 0,00s). Wenn man sich die Ausgabe von EXPLAIN ansieht, sieht es so aus, als ob MIN() einfach den kleinsten Wert aus dem Index holen kann ('Tabellen wegoptimiert' und 'NULL' Zeilen auswählen), während SORT und LIMIT müssen den Index noch geordnet durchlaufen (106.000 Zeilen). Die tatsächlichen Auswirkungen auf die Leistung sind wahrscheinlich vernachlässigbar.

Es sieht so aus, als ob MIN() der richtige Weg ist - es ist im schlimmsten Fall schneller, im besten Fall nicht zu unterscheiden, es ist Standard-SQL und drückt den Wert, den Sie erreichen möchten, am deutlichsten aus. Der einzige Fall, in dem die Verwendung von SORT und LIMIT wünschenswert erscheint, ist, wie bereits erwähnt, mson , in dem Sie eine allgemeine Operation schreiben, die die Spitze findet oder untere N-Werte aus beliebigen Spalten, und es lohnt sich nicht, die Sonderfalloperation auszuschreiben.

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

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

11
Otávio Décio

Wie mson und Sean McSomething hervorgehoben 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 erhalten möchten.

Beispiel:

SELECT some_other_field, field
FROM tbl
ORDER BY field
LIMIT 1
7
user650654

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

Wenn Sie eine 1-malige Abfrage haben und die Absicht so einfach ist, wie Sie angegeben haben, sollten Sie min (Feld) auswählen.

Es ist jedoch üblich, dass diese Arten von Anforderungen sich ändern: Top-n-Ergebnisse erfassen, n-te Ergebnisse erfassen usw.

Ich halte es nicht für zu schrecklich, sich auf die von Ihnen gewählte Datenbank festzulegen. Das Ändern der Datenbank sollte nicht leichtfertig erfolgen und es muss überprüft werden, welchen Preis Sie zahlen, wenn Sie diesen Schritt ausführen.

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

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

3
mson

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

2
Charles Bretana