DISTINCT kombiniert mit ORDER
BY benötigt in vielen Fällen eine Temporärtabelle.
Weil DISTINCT unter Umständen GROUP
BY verwendet, sollten Sie wissen, wie MySQL mit
Spalten in ORDER BY- oder
HAVING-Klauseln verfährt, die nicht Teil der
gewählten Spalten sind. Siehe auch
Abschnitt 12.11.3, „GROUP BY mit versteckten Feldern“.
In vielen Fällen kann eine DISTINCT-Klausel
als Sonderfall von GROUP BY betrachtet
werden. So sind beispielsweise die beiden folgenden Abfragen
gleichwertig:
SELECT DISTINCT c1, c2, c3 FROM t1 WHERE c1 >const; SELECT c1, c2, c3 FROM t1 WHERE c1 >constGROUP BY c1, c2, c3;
Aufgrund dieser Äquivalenz können die Optimierungen, die für
GROUP BY-Abfragen verwendbar sind, auch auf
Abfragen mit einer DISTINCT-Klausel
angewendet werden. Insofern sollten Sie, um weitere
Informationen zu Optimierungsmöglichkeiten bei
DISTINCT-Abfragen zu erhalten, unter
Abschnitt 7.2.13, „GROUP BY-Optimierung“, nachschlagen.
Wenn Sie LIMIT
mit
row_countDISTINCT kombinieren, beendet MySQL die
Abfrage, sobald row_count eindeutige
Datensätze gefunden wurden.
Wenn Sie nicht Spalten aus allen in einer Abfrage aufgeführten
Tabellen verwenden, beendet MySQL das Scannen unbenutzter
Tabellen, sobald die erste Übereinstimmung gefunden wurde. Im
folgenden Fall (in dem vorausgesetzt wird, dass
t1 vor t2 benutzt wird,
was mit EXPLAIN verifiziert werden kann)
beendet MySQL das Auslesen von t2 für einen
beliebigen Datensatz in t1, sobald der erste
Datensatz in t2 gefunden wird:
SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.
