- Veröffentlicht am
Was sind SQL-Indizes? Warum sie wichtig sind und wie sie funktionieren
- Autoren
Was sind SQL-Indizes? Warum sie wichtig sind und wie sie funktionieren
Indizes gehören zu den wichtigsten Werkzeugen zur Verbesserung der Datenbankleistung.
In diesem Artikel erfährst du:
- Was SQL-Indizes sind
- Warum sie Abfragen erheblich beschleunigen
- Wie du sie erstellst
- Ein Beispiel für Leistungsunterschiede
- Wie sie intern funktionieren
Machen wir Indizes anschaulich.
Was ist ein Index?
Ein Index in SQL ist eine spezielle Datenstruktur (üblicherweise ein B-Baum), mit der die Datenbank Zeilen deutlich schneller finden kann, ohne die gesamte Tabelle zu durchsuchen.
Du kannst dir einen Index so vorstellen:
- Eine sortierte Liste von Werten
- Jeder Wert verweist auf eine Zeile in der Haupttabelle
- So organisiert, dass die Datenbank sie schnell durchsuchen kann (logarithmische Laufzeit)
Ohne Index → Die Datenbank muss jede Zeile prüfen.
Mit Index → Die Datenbank springt direkt zu den passenden Werten.
Warum SQL-Indizes entwickelt wurden
Indizes lösen ein bestimmtes Problem:
Abfragen beschleunigen, die nach bestimmten Werten suchen.
Sie wurden entwickelt, weil vollständige Tabellenscans bei wachsenden Datenmengen zu langsam werden.
In einer Tabelle mit 10 Zeilen ist es schnell, alle zu durchsuchen.
In einer Tabelle mit 10 Millionen Zeilen wird dieses wiederholte Vorgehen unbrauchbar.
Indizes ermöglichen:
- Schnelles Nachschlagen
- Schnelles Sortieren (
ORDER BY) - Schnelle Joins
- Schnelle Eindeutigkeitsprüfungen (über einen UNIQUE-Index)
Datenbanken wie PostgreSQL, MySQL und SQLite setzen alle darauf.
Beispiel mit JOINs
Indizes beschleunigen auch JOINs erheblich.
Verwenden wir die Tabellen users und orders:
SELECT users.name, orders.product
FROM orders
JOIN users ON orders.user_id = users.id
WHERE users.email = 'bob@example.com';
Empfohlene Indizes
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_orders_user_id ON orders(user_id);
Ohne Indizes: Vollständige Tabellenscans auf beiden Seiten
Wenn auf users.email und orders.user_id keine Indizes existieren, muss die Datenbank:
- Jede Zeile in
usersdurchsuchen, um Zeilen zu finden, die der E-Mail-Bedingung entsprechen - Jede Zeile in
ordersdurchsuchen, um Zeilen zu finden, derenuser_idmit diesen Benutzer-IDs übereinstimmt
Das nennt man einen sequenziellen Scan oder vollständigen Tabellenscan.
Beispielhafte Größenordnung:
- Tabelle
users: 100.000 Zeilen - Tabelle
orders: 1.000.000 Zeilen
Die Datenbank muss Folgendes untersuchen:
- 100.000 Benutzerzeilen
- 1.000.000 Bestellzeilen
Obwohl das Endergebnis möglicherweise nur eine einzige Zeile enthält, ist der Suchaufwand sehr hoch.
Ungefähre Leistung (je nach Rechner unterschiedlich):
- Prüfung von 100.000 Benutzern + 1 Million Bestellungen
- Ohne Indizes: etwa 300 bis 600 ms
- Mit Indizes: etwa 1 bis 3 ms
Das ist eine 100- bis 500-fache Verbesserung.
Mit Indizes: Schnelles, direktes Nachschlagen
Mit den beiden Indizes:
idx_users_email→ Ermöglicht das sofortige Auffinden des Benutzers mit dieser E-Mail-Adresseidx_orders_user_id→ Ermöglicht das sofortige Auffinden aller Bestellungen dieses Benutzers
Statt Millionen von Zeilen zu durchsuchen:
- Die Datenbank springt direkt zu den richtigen Einträgen im Index (ein Nachschlagen im B-Baum)
- Nur die relevanten Zeilen werden berührt
- Der JOIN wird extrem schnell
Was beeinflusst die Leistung?
Die genaue Dauer hängt von der Hardware ab. Diese Faktoren auf Rechnerebene sind jedoch besonders wichtig:
| Faktor | Auswirkung |
|---|---|
| Laufwerkstyp (SSD gegenüber HDD) | Enormer Einfluss: SSDs sind bei zufälligen Zugriffen 10- bis 100-mal schneller |
| RAM-Größe | Wenn Tabellen/Indizes in den Arbeitsspeicher passen, werden Abfragen erheblich schneller |
| CPU-Geschwindigkeit | Beeinflusst, wie schnell die Knoten des B-Baums durchsucht werden |
| Puffercache | Aufgewärmte Caches machen wiederholte Abfragen deutlich schneller |
| Tabellengröße | Je größer die Tabelle, desto wichtiger werden Indizes |
Indizes sind in Anwendungen unverzichtbar, weil bei wachsenden Datenmengen selbst leistungsfähige Rechner mit wiederholten vollständigen Tabellenscans zu kämpfen haben.
- Ohne Indizes: Die Datenbank muss jede Zeile in beiden Tabellen lesen
- Mit Indizes: Die Datenbank schlägt Werte mithilfe effizienter Datenstrukturen schnell nach
- Dadurch lassen sich JOINs auf Millionen von Zeilen mit Antwortzeiten im Millisekundenbereich skalieren
Wie Indizes intern funktionieren (einfach erklärt)
Die meisten SQL-Datenbanken verwenden B-Bäume, die:
- Werte sortiert halten
- Eine Suche ähnlich der binären Suche ermöglichen
- Eine extrem geringe Tiefe haben (üblicherweise 3 bis 5 Ebenen, selbst bei riesigen Tabellen)
Das bedeutet:
- Eine Zeile zu finden erfordert nur wenige Vergleiche
- Der Zugriff ist vorhersehbar und schnell
- Indizes wachsen logarithmisch statt linear
Du musst den Algorithmus nicht im Detail verstehen. Die entscheidende Idee lautet:
Einen sortierten Baum zu durchsuchen ist viel schneller als eine Million unsortierter Zeilen zu durchsuchen.
Wann solltest du einen Index verwenden?
Verwende einen Index, wenn du:
- Häufig mit
SELECTanhand einer Spalte abfragst - Mit
WHEREfilterst - Mit
ORDER BYsortierst - Tabellen über Fremdschlüssel per JOIN verbindest
- Eindeutigkeit erzwingst (
UNIQUE INDEX) - Mit Gleichheits- oder Bereichsabfragen suchst
Indizes sind besonders wertvoll für:
- E-Mail-Adressen
- Benutzernamen
- created_at
- Fremdschlüssel (
user_id,post_id) - Slugs
- Nachschlagespalten
Wann du keinen Index verwenden solltest
Indizes verursachen Kosten:
- Sie belegen Speicherplatz auf dem Laufwerk
- Sie verlangsamen Schreibvorgänge (INSERT/UPDATE/DELETE müssen den Index aktualisieren)
Vermeide Indizes für:
- Boolesche Spalten
- Spalten mit sehr geringer Kardinalität (zum Beispiel Geschlecht, Status = „aktiv“)
- Spalten, die selten in Abfragen verwendet werden
- Sehr große Textspalten