Daten & Performance

Datenbank-Indizes: Warum Abfragen langsam werden und wann ein Index hilft

Eine Anwendung, die im Test schnell war, wird im Betrieb zäh. Der Reflex ist mehr Hardware. Die Ursache liegt fast immer eine Ebene tiefer: Abfragen, die mit wachsender Datenmenge ganze Tabellen lesen, weil der passende Zugriffsweg fehlt.

Autor Julien MarschallVeröffentlicht 31.08.2026Lesezeit 8 Min.

Ein Index ist keine Beschleunigung im Sinne von mehr Leistung, sondern eine zweite, sortierte Sicht auf Daten. Statt jede Zeile anzusehen, kann die Datenbank gezielt zu den passenden Einträgen springen. Der Unterschied wächst mit der Tabellengröße — deshalb fällt das Problem im Test mit tausend Zeilen nicht auf und im Betrieb mit Millionen sofort.

Erst messen, dann indizieren

Der wichtigste Schritt kommt vor jeder Änderung: den Ausführungsplan der langsamen Abfrage ansehen. Alle gängigen Datenbanken liefern ihn (EXPLAIN oder EXPLAIN ANALYZE). Er zeigt, ob die Datenbank einen Index benutzt, wie viele Zeilen sie erwartet und wie viele sie tatsächlich gelesen hat.

Besonders aussagekräftig ist die Abweichung zwischen geschätzten und tatsächlichen Zeilen. Weicht sie stark ab, fehlen dem Optimierer aktuelle Statistiken — und dann führt auch ein neuer Index nicht zum Ziel, weil die Datenbank ihn gar nicht wählt.

Die häufigste Fehldiagnose lautet „die Datenbank ist zu langsam“. In der Praxis sind es meist wenige Abfragen, die den Großteil der Last erzeugen. Wer die zehn teuersten Abfragen nach Gesamtzeit sortiert und die ersten zwei behebt, löst mehr als jede Hardware-Aufrüstung.

Welche Spalten überhaupt in Frage kommen

Ein Index lohnt sich dort, wo gefiltert, verbunden oder sortiert wird — also in WHERE, JOIN und ORDER BY. Entscheidend ist die Selektivität: Wie stark grenzt die Bedingung ein? Eine Spalte mit zwei möglichen Werten liefert selten einen brauchbaren Index, eine Kundennummer fast immer.

  • Fremdschlüssel: Werden regelmäßig für Verknüpfungen genutzt und sind in vielen Systemen nicht automatisch indiziert.
  • Zeitstempel: Fast jede Auswertung filtert nach einem Zeitraum.
  • Statusspalten in Kombination: Allein zu unspezifisch, zusammen mit einem Zeitstempel oder einer Mandanten-ID sehr wirksam.

Zusammengesetzte Indizes und die Reihenfolge

Bei mehrspaltigen Indizes entscheidet die Reihenfolge über die Nutzbarkeit. Ein Index auf (mandant, status, erstellt_am) hilft bei einer Abfrage nach Mandant, nach Mandant und Status sowie nach allen dreien — aber nicht bei einer Abfrage, die nur nach Status filtert. Die Regel: Gleichheitsbedingungen nach vorn, Bereichsbedingungen nach hinten.

Ein Index, der alle in der Abfrage benötigten Spalten enthält, kann die Tabelle vollständig ersetzen. Diese abdeckenden Indizes sind der stärkste Hebel bei häufigen Listenabfragen — und zugleich der breiteste, also teuerste.

Warum Indizes auch schaden

Jeder Index wird bei jedem Schreibvorgang mitgepflegt. Eine Tabelle mit zwölf Indizes hat bei jedem INSERT zwölf zusätzliche Schreiboperationen. Bei schreiblastigen Tabellen kehrt sich der Nutzen dadurch um. Dazu kommt Speicherplatz und längere Wartungsfenster.

Ebenso teuer sind ungenutzte Indizes, die aus einer alten Version stammen. Alle verbreiteten Datenbanken bieten Statistiken über die Index-Nutzung. Wer sie einmal im Quartal ansieht und nachweislich ungenutzte Indizes entfernt, gewinnt Schreibleistung ohne Risiko für die Lesepfade.

Abfragen, die keinen Index nutzen können

Ein Index wird ignoriert, sobald die indizierte Spalte in eine Funktion eingepackt wird — etwa ein Datumsfeld, auf das eine Umrechnung angewendet wird, oder ein Feld, das für einen Vergleich in Kleinbuchstaben umgewandelt wird. Die Lösung ist entweder eine Umformulierung der Bedingung oder ein funktionaler Index, sofern die Datenbank ihn unterstützt.

Der zweite Klassiker ist die Suche mit führendem Platzhalter. Eine Suche nach beliebigem Text mitten im Feld kann ein normaler Index nicht bedienen; dafür braucht es Volltextindizes oder eine eigene Suchlösung.

Vorgehen, das sich bewährt hat

Erst die teuersten Abfragen identifizieren, dann Ausführungspläne ansehen, dann genau einen Index anlegen und die Wirkung messen. Mehrere Änderungen gleichzeitig machen das Ergebnis nicht zuordenbar. In produktiven Systemen wird der Index nach Möglichkeit ohne Sperre angelegt — die gängigen Datenbanken bieten dafür eigene Varianten.

Und der wichtigste Punkt: Der Index ist die Behebung, nicht die Ursache. Wenn eine Listenansicht Millionen Zeilen sortiert, um zwanzig anzuzeigen, ist die Abfrage das Problem. Wie sich Ergebnisse zusätzlich zwischenspeichern lassen, behandelt der Beitrag zu Caching-Strategien.

Systeme, die Releases aushalten

Architektur und Betrieb ohne Bauchschmerzen beim Deployment. Fragen? [email protected]

Projekt anfragen →

Häufige Fragen

Woran erkenne ich, dass ein Index fehlt?
Am Ausführungsplan der Abfrage. Ein vollständiger Tabellenscan bei einer Abfrage, die nur wenige Zeilen zurückgibt, ist das klarste Signal. Ebenso aussagekräftig ist eine große Abweichung zwischen geschätzter und tatsächlicher Zeilenzahl — dann sind meist die Statistiken veraltet.
Wie viele Indizes verträgt eine Tabelle?
Es gibt keine feste Zahl, aber jeder Index kostet Schreibleistung und Speicher. Als Orientierung: Bei schreiblastigen Tabellen sollte jeder Index einen belegbaren Nutzen für eine reale Abfrage haben. Ungenutzte Indizes lassen sich über die Nutzungsstatistiken der Datenbank identifizieren und entfernen.
Warum wird mein neuer Index nicht verwendet?
Häufige Gründe: Die Spalte wird in der Abfrage in eine Funktion eingepackt, die Reihenfolge der Spalten im zusammengesetzten Index passt nicht zur Bedingung, die Bedingung ist zu unspezifisch, oder die Statistiken sind veraltet und der Optimierer schätzt die Trefferzahl falsch ein.