Ein enggefasster Indexscan kann je nach Abfragebedingung entweder ein vollständiger Indexscan oder ein Bereichsindexscan sein.
Wenn die Bedingungen für einen lockeren Indexscan nicht
erfüllt werden, ist es trotzdem möglich, die Erstellung von
Temporärtabellen für GROUP BY
-Abfragen zu
umgehen. Wenn in der WHERE
-Klausel
Bereichsbedingungen vorhanden sind, liest diese Methode nur
die Schlüssel aus, die diese Bedingungen erfüllen.
Andernfalls wird ein Indexscan durchgeführt. Da diese Methode
alle Schlüssel in jedem von der
WHERE
-Klausel definierten Bereich liest
oder den gesamten Index scannt, sofern keine
Bereichsbedingungen vorhanden sind, sprechen wir hier vom
enggefassten Indexscan. Beachten Sie,
dass die Gruppierungsoperation beim enggefassten Indexscan
erst durchgeführt wird, wenn alle Schlüssel gefunden wurden,
die die Bereichsbedingungen erfüllen.
Damit diese Methode funktioniert, ist eine
Konstantengleichheitsbedingung für alle Spalten in einer
Abfrage ausreichend, wenn diese Abfrage die Schlüssel
referenziert, die vor oder zwischen den Teilen des
GROUP BY
-Schlüssels auftreten. Die
Konstanten aus den Gleichheitsbedingungen füllen alle
„Lücken“ in den Suchschlüsseln auf, sodass es
möglich ist, vollständige Präfixe des Indexes zu bilden.
Diese Indexpräfixe können dann für Indexsuchvorgänge
verwendet werden. Wenn Sie die Sortierung des GROUP
BY
-Ergebnisses benötigen und es möglich ist,
Suchschlüssel zu bilden, die Präfixe des Indexes sind, dann
vermeidet MySQL außerdem zusätzliche Sortieroperationen,
weil das Suchen mit Präfixen in einem sortierten Index
bereits alle Schlüssel in der korrekten Reihenfolge abruft.
Die folgenden Abfragen funktionieren beim oben beschriebenen
lockeren Indexscan nicht, wohl allerdings beim enggefassten
Indexscan (sofern ein Index idx(c1,c2,c3)
für die Tabelle t1(c1,c2,c3,c4)
vorhanden
ist).
In der GROUP BY
-Klausel ist zwar eine
Lücke vorhanden, aber diese wird von der Bedingung
c2 = 'a'
abgedeckt.
SELECT c1, c2, c3 FROM t1 WHERE c2 = 'a' GROUP BY c1, c3;
GROUP BY
beginnt nicht mit dem ersten
Teil des Schlüssels, aber es ist eine Bedingung
vorhanden, die eine Konstante für diesen Teil angibt:
SELECT c1, c2, c3 FROM t1 WHERE c1 = 'a' GROUP BY c2, c3;
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.