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 users durchsuchen, um Zeilen zu finden, die der E-Mail-Bedingung entsprechen
    • Jede Zeile in orders durchsuchen, um Zeilen zu finden, deren user_id mit 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-Adresse
    • idx_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:

    FaktorAuswirkung
    Laufwerkstyp (SSD gegenüber HDD)Enormer Einfluss: SSDs sind bei zufälligen Zugriffen 10- bis 100-mal schneller
    RAM-GrößeWenn Tabellen/Indizes in den Arbeitsspeicher passen, werden Abfragen erheblich schneller
    CPU-GeschwindigkeitBeeinflusst, wie schnell die Knoten des B-Baums durchsucht werden
    PuffercacheAufgewärmte Caches machen wiederholte Abfragen deutlich schneller
    TabellengrößeJe 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 SELECT anhand einer Spalte abfragst
    • Mit WHERE filterst
    • Mit ORDER BY sortierst
    • 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