Datenbank-Indizierung: Die Grundlagen
Indizes beschleunigen das Lesen und verlangsamen das Schreiben. Die Grundlagen, wann welcher Indextyp hilft und wann er nur Speicher kostet.
/images/engineering/datenbank-indizierung-grundlagen.webpEin Index ist eine sortierte Zusatzstruktur, mit der die Datenbank Zeilen findet, ohne die ganze Tabelle zu lesen. In einem Praxisfall sank eine Produktabfrage von 340 Millisekunden auf 3,2 – bei 180.000 Zeilen. Der Preis: Jeder Einfüge- und Änderungsvorgang muss den Index mitpflegen, und er belegt Speicher. Ein Index lohnt sich, wenn gelesen weit häufiger wird als geschrieben.
Was macht ein Index technisch?
Er hält die Werte einer oder mehrerer Spalten in sortierter Reihenfolge und verweist auf die zugehörige Zeile. Ohne Index bleibt der Datenbank nur der vollständige Tabellendurchlauf. Mit Index kann sie den Bereich direkt anspringen – ähnlich wie ein Register am Ende eines Fachbuchs, das die Suche auf eine halbe Seite verkürzt.
Wann bringt ein Index nichts?
Wenn die Abfrage ohnehin einen großen Teil der Tabelle liest. Ab etwa 20 bis 30 Prozent der Zeilen ist der Umweg über den Index teurer als der direkte Durchlauf, weil zu jedem Treffer ein zusätzlicher Zugriff auf die eigentliche Zeile kommt. Ebenso wirkungslos ist er, wenn die Abfrage den Spaltenwert erst berechnet – eine Funktion um die indizierte Spalte verhindert ihre Nutzung.
Welche Spalten gehören in einen Index?
Zuerst die Spalten, die in WHERE-Bedingungen häufig exakt verglichen werden: Fremdschlüssel, Status, Mandantenkennung. Danach die Spalten, nach denen sortiert wird. Ein zusammengesetzter Index über zwei Spalten deckt dabei nur die Reihenfolge ab, in der er definiert wurde – ein Index auf Ort und Datum hilft bei einer Suche nach Datum allein nicht.
Was kostet ein Index wirklich?
Speicher und Schreibzeit. Ein Index über eine Textspalte mit 180.000 Zeilen belegte in unserem Fall 14 Megabyte – wenig, gemessen an der Tabelle. Die Schreibkosten wiegen schwerer: Jedes INSERT muss den neuen Wert in die Indexsortierung einsortieren, was bei schreiblastigen Tabellen mit vielen Indizes schnell die halbe Laufzeit ausmacht. Fünf Indizes auf einer Tabelle sind selten ein Problem, fünfzehn schon.
Wie findet man die Abfragen, die einen Index brauchen?
Über das Abfrageprotokoll der Datenbank, sortiert nach Gesamtlaufzeit – nicht nach Einzellaufzeit. Eine Abfrage, die 200 Millisekunden braucht und 40.000-mal am Tag läuft, kostet mehr als eine, die zwei Sekunden braucht und einmal stündlich läuft. Erst diese Rangliste zeigt, welche drei Indizes den größten Effekt haben.
Was ist mit mehreren Spalten in einem Index?
Die Reihenfolge entscheidet über die Wirkung. Ein zusammengesetzter Index wirkt wie ein sortiertes Telefonbuch: Nach dem ersten Feld lässt sich direkt suchen, nach dem zweiten nur innerhalb eines festen ersten Feldes. Wer häufig nach Status allein filtert, braucht deshalb einen eigenen Index auf Status – der zusammengesetzte hilft dabei nicht.
Woran erkennt man, dass ein Index fehlt?
Am Ausführungsplan. Steht dort ein vollständiger Tabellendurchlauf, obwohl die Abfrage nur wenige Zeilen erwartet, fehlt mit hoher Wahrscheinlichkeit ein passender Index. Umgekehrt ist ein Index verdächtig, wenn die Datenbank ihn trotz passender Bedingung nicht nutzt – dann stimmt meist die Definition nicht zur Abfrage.
Erst messen, dann indizieren
Indizes sind kein Gütesiegel, sondern Werkzeug. Wer blind jede Spalte indiziert, bremst das Schreiben und gewinnt nichts beim Lesen. Der belastbare Weg führt über eine Rangliste der langsamsten Abfragen, den Ausführungsplan und eine Messung vor und nach der Änderung. Drei gut gewählte Indizes schlagen zwanzig zufällige fast immer. Prüfen Sie nach jeder Änderung den Ausführungsplan erneut – eine Abfrage, die den neuen Index umgeht, hat nichts gewonnen.
Wir bauen das für Sie
Vom Artikel zur Implementierung — sprechen Sie mit uns.