Teil 1: MySQL4 - Optimierung von Anfragen

SQL-Optimierung: Indizes richtig einsetzen

Indizierte Tabellen

Das beschriebene Beispiel entspricht weitgehend der Art und Weise, wie MySQL Tabellen indiziert, auch wenn die einzelnen Details je nach Tabellentyp ein wenig voneinander abweichen. Bei MyISAM- und ISAM-Tabellen werden die Datenzeilen der Tabelle in einer Datendatei abgelegt, die Indexwerte jedoch in einer Indexdatei. Eine Tabelle kann mehrere Indizes haben; sie alle werden innerhalb ein und derselben Indexdatei abgelegt. Jeder Index in der Indexdatei besteht aus einem sortierten Array aus Datensätzen mit Schlüsseln, die für den schnellen Zugriff auf die Datendatei genutzt werden.

Im Gegensatz dazu werden Datenzeilen und Indexwerte bei BDB- und InnoDB-Tabellen nicht auf diese Weise getrennt, auch wenn beide Tabellentypen Indizes als Mengen mit sortierten Werten behandeln. Der BDB-Handler verwendet pro Tabelle eine einzelne Datei, in der sowohl Daten- als auch Indexwerte abgelegt werden; der InnoDBHandler benutzt einen einzelnen Tablespace, innerhalb dessen er den Speicherplatz für Daten und Indizes für alle InnoDB-Tabellen verwaltet.

Die obige Darstellung beschreibt den Vorteil eines Index bei Anfragen, die sich nur auf eine einzige Tabelle beziehen, wobei durch die Nutzung des Index die Suche wesentlich beschleunigt wird, weil die Tabelle nicht mehr vollständig durchsucht werden muss. Noch wertvoller sind die Indizes aber, wenn Sie Anfragen mit Joins über mehrere Tabellen ausführen. Bei Anfragen innerhalb einer einzigen Tabelle ist die Anzahl der Werte, die Sie pro Spalte auswerten müssen, gleich der Anzahl der Zeilen in der Tabelle. Bei einer Anfrage über mehrere Spalten steigt die Anzahl möglicher Kombinationen rapide, weil sie das Produkt der Zeilen in den Tabellen darstellen.