PERFORMANCE / INDEXE

Indexe richtig setzen – warum EXPLAIN dein bester Freund ist

Es ist fast immer ein Index. Wenn eine Abfrage langsam ist, wenn die Seite hängt, wenn der Datenbankserver unter Last stöhnt – neun von zehn Mal ist es ein fehlender oder falsch gesetzter Index. Das andere Mal ist es ein SELECT * auf einer Tabelle mit 2 Millionen Zeilen. Manchmal beides gleichzeitig.

Was EXPLAIN dir zeigt

EXPLAIN vor jede Abfrage setzen die langsam ist. Das Ergebnis zeigt wie MySQL die Abfrage ausführt – welche Tabellen in welcher Reihenfolge gelesen werden, ob ein Index benutzt wird, und wieviele Zeilen die Engine schätzungsweise scannen muss.

-- Das hier ist der Moment der Wahrheit EXPLAIN SELECT * FROM bestellungen WHERE kunde_id = 42 AND datum >= '2024-01-01'; -- Schlimmes Ergebnis: type=ALL, rows=847291, key=NULL -- Das bedeutet: Full Table Scan. Alle 847.291 Zeilen werden gelesen. -- Für JEDE Abfrage. Jedes Mal. -- Besser nach Index auf (kunde_id, datum): -- type=ref, rows=23, key=idx_kunde_datum -- 23 Zeilen statt 847.291. Das ist der Unterschied.

Welche Indexe wann

Einzelner Index auf Spalten die häufig in WHERE-Klauseln auftauchen. Zusammengesetzter Index wenn immer die gleiche Kombination abgefragt wird – die Reihenfolge dabei ist wichtig: selektivste Spalte zuerst, dann die Einschränkungsspalte. Foreign Keys brauchen fast immer einen Index auf der referenzierenden Seite – MySQL legt den nicht automatisch an.

Was man lassen sollte: Indexe auf Spalten die wenige verschiedene Werte haben (boolean, status mit 3 Werten) – der Optimizer ignoriert die meistens sowieso. Und zu viele Indexe auf write-heavy Tables – jeder Index kostet bei INSERT und UPDATE Zeit.

EXPLAIN ANALYZE für tiefere Analyse

-- In MySQL 8+ und MariaDB: EXPLAIN ANALYZE führt die Abfrage wirklich aus EXPLAIN ANALYZE SELECT b.id, b.betrag FROM bestellungen b JOIN kunden k ON k.id = b.kunde_id WHERE k.plz = '53177' ORDER BY b.datum DESC LIMIT 10; -- Zeigt echte Laufzeiten statt Schätzungen – sehr nützlich bei JOINs

Wer das einmal verinnerlicht hat, benutzt EXPLAIN reflexartig bevor jede neue Abfrage in Produktion geht. Das spart mehr Zeit als jedes andere Datenbankoptimierungs-Tool.


← zurück zu Datenbanken   📂 Archiv