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.