Drei Sekunden zu viel
Nordwind Rad ist gewachsen. Die Tabelle der Bestellungen hat zwei Millionen Zeilen. Im Support sucht jemand eine Bestellung über die E-Mail-Adresse, und die Seite lädt drei Sekunden lang.
Die Abfrage ist richtig, nur langsam. In einem technischen Team hören Sie dann das Wort Index. Diese Lektion erklärt, was es bedeutet.
Am Ende dieser Lektion
Notiz
Ich kann erklären, wie ein Index eine Abfrage schneller macht.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Index | eine sortierte Liste einer Spalte mit Verweisen auf die Zeilen |
| SCAN | die Datenbank liest jede Zeile der Tabelle |
| SEARCH | die Datenbank geht gezielt zur gesuchten Zeile |
| Abfrageplan | der Weg, den die Datenbank für eine Abfrage wählt |
| EXPLAIN QUERY PLAN | zeigt den Abfrageplan, ohne die Abfrage auszuführen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ohne Index liest die Datenbank alles
Sie suchen in einem Telefonbuch, das nicht sortiert ist, eine Nummer. Sie müssen jede Seite lesen, bis Sie sie finden.
Eine Datenbank ohne Index macht das Gleiche. Sie liest Zeile für Zeile. Das heißt SCAN. Bei sechs Zeilen merkt das niemand. Bei zwei Millionen dauert es.
Ein Index ist wie das Register eines Buches
Ein Buch hat hinten ein Register. Die Wörter stehen dort in Reihenfolge, mit der Seitenzahl daneben. Sie finden ein Wort in Sekunden.
Ein Index ist so ein Register für eine Spalte. Die Werte stehen sortiert da, mit einem Verweis auf die Zeile. Weil sie sortiert sind, schließt die Datenbank bei jedem Schritt etwa die Hälfte aus. Echte Datenbanken nutzen dafür eine Baumstruktur. Die Schritte unten sind vereinfacht.
Ein Beispiel: Wie viele Schritte braucht die Suche?
| Zeilen in der Tabelle | SCAN, höchstens | Mit Index, etwa |
|---|---|---|
| 1000 | 1000 Schritte | 10 Schritte |
| 1.000.000 | 1.000.000 Schritte | 20 Schritte |
| 2.000.000 | 2.000.000 Schritte | 21 Schritte |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
EXPLAIN QUERY PLAN zeigt den gewählten Weg
Sie können die Datenbank fragen, wie sie antworten wird. Schreiben Sie EXPLAIN QUERY PLAN vor die Abfrage. Sie liefert dann keine Bestellungen, sondern ihren Plan.
SCAN heißt: die ganze Tabelle lesen. SEARCH ... USING INDEX heißt: über einen Index gehen. Starten Sie die zwei Blöcke und vergleichen Sie.
Probieren Sie es: der Plan ohne Index
-- Wie sucht die Datenbank diese Kundin?
EXPLAIN QUERY PLAN
SELECT * FROM bestellungen WHERE email = '[email protected]';
-- Lesen Sie die Spalte detail: SCAN heißt, die ganze Tabelle wird gelesen.
Probieren Sie es: der Plan mit Index
-- Wir legen einen Index auf die Spalte email an.
CREATE INDEX idx_bestellungen_email ON bestellungen(email);
-- Dieselbe Frage wie vorher.
EXPLAIN QUERY PLAN
SELECT * FROM bestellungen WHERE email = '[email protected]';
-- Jetzt steht dort SEARCH ... USING INDEX.
Ein häufiger Fehler
Warnung
Viele glauben, man solle einfach alle Spalten indizieren. Das stimmt nicht. Jeder Index braucht Platz, und jede neue oder geänderte Zeile muss ihn mit aktualisieren. Zu viele Indizes bremsen das Speichern neuer Bestellungen. Indizieren Sie Spalten, nach denen Sie oft in WHERE oder JOIN suchen.
Sie sind dran: Index auf die Stadt
-- Der Vertrieb sucht oft nach Stadt.
EXPLAIN QUERY PLAN
SELECT * FROM bestellungen WHERE stadt = 'Bremen';
-- Schreiben Sie hier ein CREATE INDEX für die Spalte stadt,
-- kopieren Sie darunter die EXPLAIN-Abfrage und starten Sie noch einmal.