Die effizienteste Möglichkeit, GROUP BY
zu
verarbeiten, besteht in der Verwendung des Indexes zum
direkten Abrufen der Gruppenfelder. Bei dieser Zugriffsmethode
verwendet MySQL die Eigenschaft einiger Indextypen, dass die
Schlüssel sortiert sind (z. B. BTREE
).
Diese Eigenschaft erlaubt die Verwendung von
Suchvorgangsgruppen in einem Index, ohne dass alle Schlüssel
im Index berücksichtigt werden müssten, die die
WHERE
-Bedingungen erfüllen. Diese
Zugriffsmethode berücksichtigt also nur einen Bruchteil der
Schlüssel in einem Index und heißt deswegen
lockerer Indexscan. Wenn keine
WHERE
-Klausel vorhanden ist, liest ein
lockerer Indexscan so viele Schlüssel, wie Gruppen vorhanden
sind. Diese Anzahl kann bedeutend kleiner sein als die aller
Schlüssel. Wenn die WHERE
-Klausel
Bereichsprädikate enthält (siehe auch die Beschreibung des
Join-Typs range
in
Abschnitt 7.2.1, „EXPLAIN
-Syntax (Informationen über ein
SELECT
erhalten)“), dann sucht ein lockerer Indexscan
nach dem jeweils ersten Schlüssel aller Gruppen, die die
Bereichsbedingungen erfüllen, und liest dann erneut die
kleinstmögliche Anzahl Schlüssel aus. Dies ist unter den
folgenden Bedingungen möglich:
Die Abfrage gilt einer einzelnen Tabelle.
Die GROUP BY
-Klausel enthält die
ersten aufeinander folgenden Teile des Indexes. (Wenn die
Abfrage statt einer GROUP BY
- eine
DISTINCT
-Klausel enthält,
referenzieren alle den Anfang des Indexes.)
Wenn überhaupt, so werden als einzige
Zusammenfassungsfunktionen MIN()
und
MAX()
verwendet, die zudem alle
dieselbe Spalte referenzieren.
Alle Teile des Indexes, die nicht aus der in der Abfrage
referenzierten GROUP BY
-Klausel
stammen, müssen Konstanten sein (d. h., sie müssen in
Gleichungen mit Konstanten referenziert werden).
Ausgenommen ist lediglich das Argument der Funktionen
MIN()
und MAX()
.
Die EXPLAIN
-Ausgabe für solche Abfragen
zeigt Using index for group-by
in der
Spalte Extra
an.
Die folgenden Abfragen gehören in diese Kategorie,
vorausgesetzt, ein Index idx(c1,c2,c3)
ist
für die Tabelle t1(c1,c2,c3,c4)
vorhanden:
SELECT c1, c2 FROM t1 GROUP BY c1, c2; SELECT DISTINCT c1, c2 FROM t1; SELECT c1, MIN(c2) FROM t1 GROUP BY c1; SELECT c1, c2 FROM t1 WHERE c1 <const
GROUP BY c1, c2; SELECT MAX(c3), MIN(c3), c1, c2 FROM t1 WHERE c2 >const
GROUP BY c1, c2; SELECT c2 FROM t1 WHERE c1 <const
GROUP BY c1, c2; SELECT c1, c2 FROM t1 WHERE c3 =const
GROUP BY c1, c2;
Die folgenden Abfragen können aus den angegebenen Gründen nicht mit dieser schnellen Auswahlmethode ausgeführt werden:
Es sind andere Zusammenfassungsfunktionen als
MIN()
oder MAX()
vorhanden, z. B.:
SELECT c1, SUM(c2) FROM t1 GROUP BY c1;
Die Felder in der GROUP BY
-Klausel
referenzieren nicht den Anfang des Indexes:
SELECT c1,c2 FROM t1 GROUP BY c2, c3;
Die Abfrage referenziert einen Teil eines Schlüssels, der
nach dem GROUP BY
-Teil kommt und für
den keine Gleichzeit mit einer Konstante vorliegt. Ein
Beispiel:
SELECT c1,c3 FROM t1 GROUP BY c1, c2;
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.