Teil 2: MySQL 4 - Optimierung der Indizes in Abfragen

SQL-Optimierung: Indexnutzung in Queries manuell steuern

Verwenden Sie EXPLAIN, um den Optimierungseinsatz zu verifizieren

Überprüfen Sie, ob die Indizes in Ihrer Anfrage genutzt werden, um bestimmte Zeilen schnell auszuschließen. Falls das nicht der Fall ist, könnten Sie es mit einem STRAIGHT_JOIN versuchen, um einen Join auszuführen, bei dem die Tabellen in einer bestimmten Reihenfolge verwendet werden (führen Sie die Anfrage sowohl mit als auch ohne STRAIGHT_JOIN durch; möglicherweise hat MySQL einen guten Grund, die Indizes nicht in der Art zu verwenden, wie Sie es für das Beste halten). Seit MySQL 3.23.12 können Sie auch die Anweisungen USE INDEX bzw. IGNORE INDEX verwenden, um dem Server zu signalisieren, welche Indizes vorzuziehen sind.

Probieren Sie unterschiedliche Anfrageformen aus, die Sie aber mehrfach testen

Wenn Sie alternative Formen einer Anfrage testen, sollten Sie diese jeweils mehrmals ausführen. Wenn Sie eine Anfrage nur jeweils ein einziges Mal in unterschiedlichen Formulierungen ausführen, werden Sie häufig feststellen, dass die zweite Anfrage schneller ist – aber nur, weil die Information aus der ersten Anfrage noch im Festplatten-Cache liegt und nicht erneut gelesen werden muss. Sie sollten auch versuchen, die Anfragen dann auszuführen, wenn die Systemauslastung relativ stabil ist, sodass sich andere Aktivitäten auf Ihrem System nicht negativ auswirken.

Vermeiden Sie die Überbeanspruchung der automatischen Typkonvertierung

MySQL führt die Typkonvertierung automatisch durch; wenn Sie diese Konvertierungen aber verhindern können, kann die Performance im Endeffekt besser sein. Wenn etwa num_col im folgenden Beispiel eine Integerspalte ist, dann geben die beiden folgenden Anfragen das gleiche Ergebnis zurück:

SELECT * FROM mytbl WHERE num_col = 4;
SELECT * FROM mytbl WHERE num_col = ‘4’;

Die zweite Anfrage bedingt jedoch eine Typumwandlung. Der Konvertierungsvorgang selbst wirkt sich in geringem Maße nachteilig auf die Leistung aus, weil zur Durchführung des Vergleichs die Ganzzahl und der String konvertiert werden müssen. Ein schwerwiegenderes Problem ist allerdings die Tatsache, dass – sofern num_col indiziert ist – ein Vergleich, der eine Typumwandlung bedingt, die Verwendung des Index verhindern kann.