Teil 2: MySQL 4 - Optimierung der Indizes in Abfragen
SQL-Optimierung: Indexnutzung in Queries manuell steuern
Wie die Optimierung funktioniert
Die Anfrageoptimierung von MySQL verfolgt mehrere Ziele. Am wichtigsten dabei ist, Indizes zu verwenden, wo immer das möglich ist, und dabei den restriktivsten Index zu wählen, um möglichst viele Zeilen möglichst schnell ausschließen zu können. Das hört sich kontraproduktiv an, weil Ihr Ziel bei der Ausführung einer SELECT
-Anweisung darin besteht, Zeilen zu finden, nicht jedoch, sie auszuschließen. Der Grund für diese Arbeitsweise der Optimierung ist die Tatsache, dass die Ihrem Suchkriterium entsprechenden Zeilen umso schneller gefunden werden, je schneller die anderen Zeilen ausgeschlossen werden können. Anfragen werden schneller, wenn die restriktivsten Überprüfungen ganz am Anfang ausgeführt werden. Angenommen, Sie führen eine Anfrage aus, die zwei Spalten auswertet, die beide einen Index haben:
SELECT col3 FROM mytable
WHERE col1 = ‘value’ AND col2 = ‘noch ein value’;
Nehmen wir ferner an, dass bei der Auswertung von col1
900 Übereinstimmungen gefunden werden, bei der Auswertung von col2
300 Übereinstimmungen und dass die Kombination beider Auswertungen schließlich 30 Zeilen ergibt. Wenn Sie zuerst col1
auswerten, müssen Sie 900 Zeilen untersuchen, um die 30 zu finden, die auch mit dem Wert in col2
übereinstimmen. Das bedeutet 870 Überprüfungen, die keine Übereinstimmung bringen. Wenn Sie als Erstes col2
auswerten, müssen Sie nur 300 Zeilen auswerten, um die 30 Übereinstimmungen mit col1
zu finden, es gibt also 270 Überprüfungen ohne Übereinstimmung, was weniger Rechenzeit und weniger Festplattenzugriffe verursacht. Aufgrund dessen wird die Optimierung zunächst versuchen, col2
zu testen.
Sie unterstützen die Optimierung, indem Sie die folgenden Regeln beachten:
Vergleichen Sie Spalten desselben Typs
Verwenden Sie beim Vergleich indizierter Spalten nur Spalten desselben Typs. Beispielsweise wird CHAR(10)
als identisch mit CHAR(10)
und VARCHAR(10)
, nicht jedoch als identisch mit CHAR(12)
oder VARCHAR(12)
betrachtet. INT
unterscheidet sich von BIGINT
. Bei MySQL-Versionen vor 3.23 war es sogar notwendig, Spalten desselben Typs zu verwenden, weil die Indizes für diese Spalten andernfalls nicht genutzt wurden. Seit Version 3.23 ist dies nicht mehr unbedingt erforderlich, aber durch die Verwendung gleicher Spaltentypen erzielen Sie eine bessere Performance als bei unterschiedlichen Typen. Wenn die verglichenen Spalten unterschiedliche Typen haben, können Sie mit ALTER TABLE
eine von ihnen so ändern, dass die Typen übereinstimmen.