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 >const
GROUP 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_count
DISTINCT
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.