Ohne Index liest die Datenbank jede Zeile, um eine Frage zu beantworten. Mit dem richtigen springt sie direkt zur Antwort. Bei einer großen Tabelle ist der Unterschied Sekunden gegen Mikrosekunden — und der falsche Index ist schlimmer als keiner, weil er Schreibvorgänge kostet und nichts einbringt.
Indizieren Sie, wonach Sie FILTERN
Die WHERE-Klausel, dann ORDER BY, dann die Join-Spalten. Nicht das, was Sie mit SELECT holen — danach sucht die Datenbank nicht.
SELECT * FROM orders WHERE customer_id = 42 ORDER BY created_at DESC;
CREATE INDEX idx_orders_customer_created ON orders (customer_id, created_at);
Bei einem zusammengesetzten Index zählt die Reihenfolge
Ein zusammengesetzter Index ist von links nach rechts nutzbar, wie ein Telefonbuch nach Nachname und dann Vorname sortiert. So sortiert finden Sie alle mit Nachnamen Ali; alle mit Vornamen Mohamed finden Sie nicht.
(customer_id, created_at)bedient einen Filter auf customer_id und einen auf beide.- Einen Filter auf created_at allein bedient er NICHT.
- Setzen Sie die Spalte, auf die Sie exakt filtern, an die erste Stelle und den Bereich oder die Sortierung an die zweite.
Beweisen Sie, dass er benutzt wird
EXPLAIN SELECT * FROM orders WHERE customer_id = 42;
type: ref oder const heißt, der Index wird genutzt. type: ALL heißt vollständiger Scan, der Index wird also ignoriert — meist, weil die Spalte in eine Funktion eingewickelt ist.
WHERE DATE(created_at) = "2026-01-01" kann keinen Index auf created_at nutzen: Die Funktion muss erst auf jeder Zeile laufen. Schreiben Sie es stattdessen als Bereich: created_at >= "2026-01-01" AND created_at < "2026-01-02".Warum man nicht alles indiziert
- Jeder Index wird bei jedem INSERT, UPDATE und DELETE mitgeführt. Zehn Indizes machen Schreibvorgänge um ein Mehrfaches langsamer.
- Sie belegen Plattenplatz, manchmal mehr als die Tabelle selbst.
- Der Planer hat mehr Auswahl und greift gelegentlich zur schlechteren.