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;
Im schlimmsten Fall, wenn Sie ein nicht indiziertes Feld betrachten, MIN()
erfordert die Verwendung einen einzigen vollständigen Durchlauf der Tabelle. Verwenden SORT
und LIMIT
erfordert 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 SORT
und LIMIT
0,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 SORT
und LIMIT
noch 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 SORT
und LIMIT
wü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 .
Einfach weil es ANSI-kompatibel ist. Limit 1 gilt speziell für MySQL, ebenso wie TOP für SQL Server.
quelle
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:
quelle
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 ...
quelle
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.
quelle