Self-Hosted Datenbanken

Indizes verstehen und richtig einsetzen

Warum sind manche SQL-Abfragen blitzschnell und andere quälend langsam? Die Antwort liegt oft in den richtigen Datenbankindizes. Erfahre, wie sie funktionieren und wie du sie optimal einsetzt.

4 min Lesezeit
Grafik: Indizes verstehen – Mehr Performance für deine Datenbank

So beschleunigen Datenbankindizes deine SQL-Abfragen

Wer mit relationalen Datenbanken wie MySQL, MariaDB oder PostgreSQL arbeitet, wird früher oder später auf den Begriff Index stoßen. Indizes gehören zu den wichtigsten Werkzeugen, um Datenbankabfragen zu beschleunigen. Richtig eingesetzt können sie Suchvorgänge von mehreren Sekunden auf wenige Millisekunden verkürzen. Falsch eingesetzt verursachen sie jedoch unnötigen Speicherverbrauch und können Schreiboperationen deutlich verlangsamen.

In diesem Beitrag erfährst du, wie Datenbankindizes funktionieren, welche Indexarten es gibt und wie du sie sinnvoll einsetzt, um die Performance deiner Datenbank zu verbessern.


Was ist ein Datenbankindex?

Ein Datenbankindex ist eine zusätzliche Datenstruktur, die der Datenbank hilft, Datensätze schneller zu finden.

Ohne Index muss die Datenbank häufig jede Zeile einer Tabelle durchsuchen. Dieses Verfahren wird als Full Table Scan bezeichnet.

Mit einem Index kann die Datenbank direkt zu den gesuchten Datensätzen springen – ähnlich wie ein Stichwortverzeichnis in einem Buch.


Warum sind Indizes wichtig?

Je größer eine Tabelle wird, desto länger dauern Suchvorgänge ohne Index.

Beispiel:

Eine Kundentabelle enthält eine Million Datensätze.

Die Abfrage:

SELECT *
FROM kunden
WHERE email = 'max.mustermann@example.de';

Ohne Index muss die Datenbank möglicherweise alle Datensätze durchsuchen.

Mit einem Index auf der Spalte email wird der Datensatz direkt gefunden.


Wie funktioniert ein Index?

Die meisten relationalen Datenbanken verwenden sogenannte B-Bäume (B-Trees) als Standardstruktur für Indizes.

Vereinfacht gesagt speichert der Index:

  • den Wert einer Spalte
  • einen Verweis auf den Datensatz

Dadurch kann die Datenbank wesentlich schneller navigieren als bei einer vollständigen Tabellenprüfung.


Vorteile von Indizes

Richtig eingesetzte Indizes bieten zahlreiche Vorteile:

  • deutlich schnellere Suchabfragen
  • bessere Performance bei JOINs
  • schnellere Sortierungen
  • effizientere Filterung mit WHERE
  • schnellere Gruppierungen (GROUP BY)
  • optimierte Sortierungen (ORDER BY)

Besonders bei großen Tabellen machen sich diese Vorteile bemerkbar.


Nachteile von Indizes

Indizes sind jedoch kein Allheilmittel.

Jeder Index benötigt:

  • zusätzlichen Speicherplatz
  • Zeit beim Einfügen neuer Datensätze
  • Zeit beim Aktualisieren
  • Zeit beim Löschen

Je mehr Indizes vorhanden sind, desto langsamer werden Schreiboperationen.


Wann sollte ein Index verwendet werden?

Ein Index ist besonders sinnvoll für Spalten, die häufig verwendet werden in:

  • WHERE
  • JOIN
  • ORDER BY
  • GROUP BY

Typische Beispiele:

  • E-Mail-Adresse
  • Benutzername
  • Kundennummer
  • Artikelnummer
  • Datum
  • Fremdschlüssel

Wann ist ein Index nicht sinnvoll?

Nicht jede Spalte profitiert von einem Index.

Beispiele:

  • Ja/Nein-Felder
  • Boolean-Werte
  • Geschlecht
  • Status mit wenigen Ausprägungen

Hat eine Spalte nur sehr wenige unterschiedliche Werte, entscheidet sich der Datenbankoptimierer häufig gegen die Nutzung eines Index.


Primärschlüssel

Jede Tabelle sollte einen Primärschlüssel besitzen.

Beispiel:

CREATE TABLE kunden (
    id INT PRIMARY KEY,
    vorname VARCHAR(100),
    nachname VARCHAR(100)
);

Der Primärschlüssel erhält automatisch einen Index.


Eindeutige Indizes

Mit einem eindeutigen Index werden doppelte Werte verhindert.

Beispiel:

CREATE UNIQUE INDEX idx_email
ON kunden(email);

Dadurch kann jede E-Mail-Adresse nur einmal vorkommen.


Normale Indizes

Ein einfacher Index:

CREATE INDEX idx_nachname
ON kunden(nachname);

Dieser verbessert Suchabfragen nach Nachnamen erheblich.


Zusammengesetzte Indizes

Oft werden mehrere Spalten gemeinsam durchsucht.

Beispiel:

CREATE INDEX idx_name
ON kunden(nachname, vorname);

Damit lassen sich Abfragen wie

SELECT *
FROM kunden
WHERE nachname = 'Mustermann'
AND vorname = 'Max';

besonders effizient ausführen.

Die Reihenfolge der Spalten im Index ist dabei entscheidend.


Index auf Fremdschlüssel

Fremdschlüssel sollten fast immer indiziert werden.

Beispiel:

CREATE INDEX idx_kunde
ON bestellungen(kunde_id);

Dadurch werden JOIN-Abfragen erheblich beschleunigt.


Volltextindizes

Für Suchfunktionen eignen sich Volltextindizes.

Beispiel:

CREATE FULLTEXT INDEX idx_text
ON artikel(beschreibung);

Diese ermöglichen wesentlich leistungsfähigere Suchabfragen als einfache LIKE-Operatoren.


Indizes anzeigen

MySQL / MariaDB

SHOW INDEX
FROM kunden;

PostgreSQL

SELECT *
FROM pg_indexes
WHERE tablename = 'kunden';

Abfragepläne analysieren

Ob ein Index tatsächlich verwendet wird, zeigt der Abfrageplan.

MySQL

EXPLAIN
SELECT *
FROM kunden
WHERE email='max.mustermann@example.de';

PostgreSQL

EXPLAIN ANALYZE
SELECT *
FROM kunden
WHERE email='max.mustermann@example.de';

Hier erkennt man unter anderem:

  • verwendete Indizes
  • geschätzte Kosten
  • Laufzeiten
  • Full Table Scans

Indizes löschen

Nicht mehr benötigte Indizes sollten entfernt werden.

MySQL:

DROP INDEX idx_name
ON kunden;

PostgreSQL:

DROP INDEX idx_name;

Häufige Fehler

Zu den häufigsten Problemen gehören:

  • zu viele Indizes
  • fehlende Indizes auf Fremdschlüsseln
  • falsche Reihenfolge zusammengesetzter Indizes
  • Indizes auf ungeeigneten Spalten
  • nie verwendete Indizes
  • fehlende Analyse mit EXPLAIN

Performance-Tipps

Einige bewährte Empfehlungen:

  • Nur häufig genutzte Spalten indizieren.
  • Schreibintensive Tabellen sparsam indizieren.
  • Regelmäßig ungenutzte Indizes entfernen.
  • Abfragepläne analysieren.
  • Fremdschlüssel immer prüfen.
  • Zusammengesetzte Indizes bewusst planen.
  • Datenbankstatistiken aktuell halten.

MySQL, MariaDB und PostgreSQL im Vergleich

Alle drei Datenbanksysteme unterstützen B-Tree-Indizes als Standard.

Darüber hinaus bieten sie weitere spezialisierte Indexarten:

MySQL / MariaDB

  • B-Tree
  • FULLTEXT
  • SPATIAL
  • HASH (Storage-Engine abhängig)

PostgreSQL

  • B-Tree
  • Hash
  • GIN
  • GiST
  • BRIN
  • SP-GiST
  • Bloom (Erweiterung)

Insbesondere PostgreSQL bietet mit GIN- und GiST-Indizes leistungsfähige Optionen für Volltextsuche, JSON-Daten, Arrays und Geodaten.


Best Practices

Für performante Datenbanken haben sich folgende Vorgehensweisen bewährt:

  • Jede Tabelle sollte einen Primärschlüssel besitzen.
  • Fremdschlüssel grundsätzlich auf ihre Indizierung prüfen.
  • Indizes nur auf häufig verwendeten Suchspalten anlegen.
  • Zusammengesetzte Indizes entsprechend der typischen Abfragen aufbauen.
  • Mit EXPLAIN oder EXPLAIN ANALYZE regelmäßig prüfen, ob Indizes genutzt werden.
  • Ungenutzte oder doppelte Indizes entfernen.
  • Nach größeren Änderungen Datenbankstatistiken aktualisieren.
  • Performance regelmäßig überwachen und optimieren.


Indizes gehören zu den wichtigsten Werkzeugen zur Optimierung relationaler Datenbanken. Sie beschleunigen Suchabfragen, JOINs und Sortierungen erheblich und sind insbesondere bei großen Tabellen unverzichtbar. Gleichzeitig erhöhen sie jedoch den Speicherbedarf und verlangsamen Schreiboperationen, weshalb sie mit Bedacht eingesetzt werden sollten.

Wer seine häufigsten Abfragen kennt, die richtigen Spalten indiziert und den Abfrageplan regelmäßig analysiert, kann die Performance seiner Datenbank nachhaltig verbessern. Ob MySQL, MariaDB oder PostgreSQL – ein durchdachtes Indexkonzept ist ein wesentlicher Baustein für schnelle und skalierbare Datenbankanwendungen.