Teil 1: MySQL4 - Optimierung von Anfragen

SQL-Optimierung: Indizes richtig einsetzen

Anfragen über mehrere Tabellen

Angenommen, Sie haben drei Tabellen t1, t2 und t3, die jeweils eine Spalte c1, c2 und c3 mit je 1.000 Zeilen enthalten, in denen wiederum die Zahlen 1 bis 1000 abgelegt sind. Eine Anfrage, mit der Sie alle Kombinationen der Tabellenzeilen ermitteln, in denen gleiche Werte abgelegt sind, würde wie folgt aussehen:

SELECT t1.c1, t2.c2, t3.c3
FROM t1, t2, t3
WHERE t1.c1 = t2.c2 AND t1.c1 = t3.c3;

Das Ergebnis dieser Anfrage sollte 1.000 Zeilen umfassen, die jeweils drei gleiche Werte enthalten. Wenn wir die Anfrage ohne die Verwendung von Indizes ausführen, wissen wir nicht, welche Zeilen welche Werte enthalten. Wir müssen also alle möglichen Kombinationen ausprobieren, um diejenigen zu finden, die mit der WHERE-Klausel übereinstimmen. Die Anzahl möglicher Kombinationen ist 1000 × 1000 × 1000 (1 Milliarde!), also eine Million mal mehr als die Anzahl der Übereinstimmungen.

Das ist viel unnützer Aufwand, und diese Anfrage ist wahrscheinlich auch sehr langsam, sogar für eine schnelle Datenbank wie MySQL. Und das bei nur 1000 Zeilen pro Tabelle! Wie wird das erst aussehen, wenn Sie Tabellen mit Millionen von Zeilen haben? Sie sehen, dass die Dauer der Verarbeitung von Joins bei zunehmender Tabellengröße extrem hoch werden kann, wenn keine Indizes verwendet werden, was wiederum zu einer sehr schlechten Performance führt. Wenn wir hingegen für die Tabellen Indizes einführen, beschleunigen wir das Ganze wesentlich, weil die Anfrage nach der Indizierung wie folgt ausgeführt werden kann:

  • Die erste Zeile von Tabelle t1 wird ausgewählt, und ihr Wert wird ermittelt.

  • Anhand des Index von Tabelle t2 geht man direkt zu der Zeile, die mit dem Wert von t1 übereinstimmt. Auf dieselbe Weise wird der Index für Tabelle t3 verwendet, um dort direkt zu der Zeile zu gelangen, die mit dem Wert aus t1 übereinstimmt.

  • Die Verarbeitung wird mit der nächsten Zeile von t1 fortgesetzt. Die oben beschriebene Prozedur wird wiederholt, bis alle Zeilen in t1 ausgewertet wurden.