Wenn ich einen Tisch habe
CREATE TABLE users (
id int(10) unsigned NOT NULL auto_increment,
name varchar(255) NOT NULL,
profession varchar(255) NOT NULL,
employer varchar(255) NOT NULL,
PRIMARY KEY (id)
)
und ich möchte alle eindeutigen Werte des profession
Feldes erhalten, was schneller (oder empfohlen) wäre:
SELECT DISTINCT u.profession FROM users u
oder
SELECT u.profession FROM users u GROUP BY u.profession
?
Antworten:
Sie sind im Wesentlichen einander äquivalent (tatsächlich implementieren einige Datenbanken dies
DISTINCT
unter der Haube).Wenn einer von ihnen schneller ist, wird es sein
DISTINCT
. Dies liegt daran, dass ein Abfrageoptimierer, obwohl beide identisch sind, die Tatsache erfassen müsste, dass SieGROUP BY
keine Gruppenmitglieder, sondern nur deren Schlüssel ausnutzen.DISTINCT
macht dies explizit, so dass Sie mit einem etwas dümmeren Optimierer davonkommen können.Im Zweifelsfall testen!
quelle
DISTINCT
undGROUP BY
unterscheidet sich darin, dassDISTINCT
die Ausgabe nicht sortiert werden muss, undGROUP BY
standardmäßig. Doch in MySQL auch eineDISTINCT
+ORDER BY
könnte noch schneller sein als einGROUP BY
aufgrund der zusätzlichen Hinweise für den Optimierer , wie durch SquareCog erläutert.Wenn Sie einen Index haben
profession
, sind diese beiden Synonyme.Wenn Sie dies nicht tun, verwenden Sie
DISTINCT
.GROUP BY
inMySQL
Sorten Ergebnisse. Sie können sogar tun:und lassen Sie Ihre Berufe sortieren
DESC
ordnen .DISTINCT
Erstellt eine temporäre Tabelle und verwendet sie zum Speichern von Duplikaten.GROUP BY
macht das gleiche, sortiert aber danach die unterschiedlichen Ergebnisse.Damit
ist schneller, wenn Sie keinen Index haben
profession
.quelle
ORDER BY NULL
um dieGROUP BY
die Art zu vermeiden.Alle obigen Antworten sind korrekt, für den Fall von DISTINCT in einer einzelnen Spalte gegenüber GROUP BY in einer einzelnen Spalte. Jede DB-Engine hat ihre eigene Implementierung und Optimierung. Wenn Sie sich (in den meisten Fällen) für den sehr geringen Unterschied interessieren, müssen Sie gegen einen bestimmten Server UND eine bestimmte Version testen! Da sich Implementierungen ändern können ...
ABER wenn Sie mehr als eine Spalte in der Abfrage auswählen, ist der DISTINCT wesentlich anders! In diesem Fall werden ALLE Spalten aller Zeilen anstelle nur einer Spalte verglichen.
Also, wenn Sie etwas haben wie:
Es ist ein häufiger Fehler zu glauben, dass das Schlüsselwort DISTINCT Zeilen durch die erste von Ihnen angegebene Spalte unterscheidet, aber das Schlüsselwort DISTINCT ist auf diese Weise ein allgemeines Schlüsselwort.
Menschen, bei denen Sie darauf achten müssen, dass die obigen Antworten nicht in allen Fällen als richtig angesehen werden ... Sie könnten verwirrt sein und die falschen Ergebnisse erzielen, während Sie nur optimieren wollten!
quelle
Entscheide dich für das Einfachste und Kürzeste, wenn du kannst - DISTINCT scheint mehr zu sein, als du suchst, nur weil es dir genau die Antwort gibt, die du brauchst und nur das!
quelle
Group by ist teurer als Distinct, da Group by eine Sortierung des Ergebnisses vornimmt, während die Unterscheidung dies vermeidet. Wenn Sie jedoch eine Gruppe erstellen möchten, die das gleiche Ergebnis wie eine eindeutige ergibt , geben Sie die Reihenfolge null an .
entspricht
quelle
SELECT profession FROM users GROUP BY profession
gut unterscheidbar kann langsamer sein als Gruppe durch in einigen Fällen in Postgres (weiß nicht über andere dbs).
getestetes Beispiel:
http://www.pgsql.cz/index.php/PostgreSQL_SQL_Tricks_I
also sei vorsichtig ... :)
quelle
Es scheint, dass die Abfragen nicht genau gleich sind. Zumindest für MySQL.
Vergleichen Sie:
Die zweite Abfrage gibt zusätzlich "Using filesort" in Extra.
quelle
ORDER BY NULL
derGROUP BY
Version hinzu und sie werden gleich sein.In MySQL verwendet "
Group By
" einen zusätzlichen Schritt :filesort
. Mir ist klar, dassDISTINCT
es schneller ist alsGROUP BY
, und das war eine Überraschung.quelle
Nach intensiven Tests kamen wir zu dem Schluss, dass GROUP BY schneller ist
SELECT sql_no_cache opnamegroep_intern FROM
telwerken
WHEREopnemergroep
IN (7,8,9,10,11,12,13) Gruppe nach opnamegroep_intern635 totaal 0,0944 Sekunden Weergave van Records 0 - 29 (635 totaal, Abfrage duurde 0,0484 Sek.)
SELECT sql_no_cache different (opnamegroep_intern) FROM
telwerken
WHEREopnemergroep
IN (7,8,9,10,11,12,13)635 totaal 0,2117 Sekunden (fast 100% langsamer) Weergave van zeichnet 0 - 29 auf (635 totaal, Abfrage duurde 0,3468 Sek.)
quelle
(eher eine funktionale Anmerkung)
Es gibt Fälle, in denen Sie GROUP BY verwenden müssen, beispielsweise wenn Sie die Anzahl der Mitarbeiter pro Arbeitgeber ermitteln möchten:
In einem solchen Szenario
DISTINCT u.employer
funktioniert das nicht richtig. Vielleicht gibt es einen Weg, aber ich weiß es einfach nicht. (Wenn jemand weiß, wie man eine solche Abfrage mit DISTINCT macht, fügen Sie bitte eine Notiz hinzu!)quelle
Hier ist ein einfacher Ansatz, bei dem die 2 verschiedenen verstrichenen Zeiten für jede Abfrage gedruckt werden.
ODER versuchen Sie SET STATISTICS TIME (Transact-SQL)
Es zeigt einfach die Anzahl der Millisekunden an, die erforderlich sind, um jede Anweisung wie folgt zu analysieren, zu kompilieren und auszuführen:
quelle
Dies ist keine Regel
Versuchen Sie es für jede Abfrage separat und gruppieren Sie dann nach ... vergleichen Sie die Zeit, um jede Abfrage abzuschließen und die schnellere zu verwenden ....
In meinem Projekt verwende ich manchmal group by und andere unterscheiden
quelle
Wenn Sie keine Gruppenfunktionen ausführen müssen (Summe, Durchschnitt usw., wenn Sie der Tabelle numerische Daten hinzufügen möchten), verwenden Sie SELECT DISTINCT. Ich vermute, es ist schneller, aber ich habe nichts zu zeigen.
Wenn Sie sich Gedanken über die Geschwindigkeit machen, erstellen Sie auf jeden Fall einen Index für die Spalte.
quelle
SELECT DISTINCT ist immer gleich oder schneller als ein GROUP BY. Auf einigen Systemen (z. B. Oracle) ist es möglicherweise so optimiert, dass es für die meisten Abfragen mit DISTINCT identisch ist. Bei anderen (z. B. SQL Server) kann dies erheblich schneller sein.
quelle
Wenn das Problem dies zulässt, versuchen Sie es mit EXISTS, da es so optimiert ist, dass es endet, sobald ein Ergebnis gefunden wird (und keine Antwort puffert). Wenn Sie also nur versuchen, Daten für eine WHERE-Klausel wie diese zu normalisieren
Eine schnellere Antwort wäre:
Dies ist nicht immer möglich, aber wenn verfügbar, sehen Sie eine schnellere Antwort.
quelle