Was bedeutet die Kardinalität eines Index?
Autor: Redaktion Domeny.ForSale Veröffentlicht
Kurz erklärt: Die Kardinalität eines Index ist die Anzahl unterschiedlicher Schlüsselwerte im Index. Die Datenbank gibt sie häufig als Schätzwert an. Sie hilft dem Optimierer einzuschätzen, wie viele Zeilen eine Abfragebedingung erfüllen könnten und ob sich die Verwendung des Index lohnt. Eine hohe Kardinalität begünstigt meist die Suche nach bestimmten Datensätzen, garantiert aber allein keine schnellere Ausführung.
Was die Kardinalität eines Index genau bedeutet
Ein Index ist eine zusätzliche Datenstruktur, die das Auffinden von Zeilen erleichtert, ohne die gesamte Tabelle durchsuchen zu müssen. Sein Schlüssel besteht aus dem Wert einer Spalte oder einer Kombination von Werten mehrerer Spalten. Die Kardinalität beschreibt, wie viele unterschiedliche Schlüssel in den Daten vorkommen, nicht die Gesamtzahl der Einträge im Index.
Angenommen, die Tabelle kunden hat 100 000 Zeilen. Wenn jeder Kunde eine andere Kennung hat, beträgt die Kardinalität des Index auf der Spalte id 100 000. Enthält die Spalte status nur die Werte aktiv, inaktiv und gesperrt, beträgt ihre Kardinalität 3.
Die in Verwaltungswerkzeugen angezeigte Zahl ist nicht immer das Ergebnis einer exakten Zählung. Die Datenbank-Engine kann sie anhand einer Stichprobe ermitteln und in den Statistiken speichern. Das sind Informationen über den Tabelleninhalt, die zur Planung von Abfragen dienen. Wie der Wert NULL berücksichtigt wird und wie die Kardinalität im Einzelnen dargestellt wird, solltest du in der Dokumentation der jeweiligen Engine nachlesen.
Kardinalität und Selektivität einer Abfrage
Die Kardinalität ist eine Eigenschaft der Daten im Index. Die Selektivität einer Bedingung beschreibt dagegen, wie stark diese Bedingung die Ergebnismenge einschränkt. In der Praxis bezeichnet man eine Bedingung, die nur einen kleinen Teil der Tabelle auswählt, als hochselektiv. Beim Vergleich numerischer Kennzahlen muss man deren Definition prüfen, da unterschiedliche Konventionen verwendet werden.
Bei der Suche nach einer eindeutigen Kennung kann die Datenbank eine einzelne Zeile finden. Für die Bedingung status = 'aktiv' muss sie möglicherweise Tausende oder Zehntausende Zeilen abrufen. Im zweiten Fall kann es aufwendiger sein, zunächst den Index zu lesen und anschließend die Datensätze aus der Tabelle abzurufen, als die gesamte Tabelle zu durchsuchen.
Die Anzahl unterschiedlicher Werte allein sagt jedoch nicht aus, wie häufig jeder einzelne Wert vorkommt. Wenn 99 000 Kunden aktiv, aber nur 20 gesperrt sind, kann der Index bei zwei Bedingungen auf derselben Spalte sehr unterschiedlich nützlich sein. Die Kardinalität beträgt weiterhin 3, doch die Daten sind ungleich verteilt.
Deshalb kann der Optimierer — der Teil der Engine, der die Ausführung einer Abfrage plant — auch andere Statistiken nutzen, beispielsweise Histogramme zur Verteilung der Werte. Ob diese verfügbar sind und wie sie genutzt werden, hängt von der Datenbank ab.
Die Kardinalität eines zusammengesetzten Index verstehen
Ein zusammengesetzter Index umfasst mehr als eine Spalte. Bei einem Index auf (land, stadt) zählt die Anzahl unterschiedlicher Paare, nicht nur die Anzahl der Länder oder Städte für sich genommen.
Eine Tabelle kann beispielsweise 10 Länder und 500 unterschiedliche Länder-Städte-Paare enthalten. Die Kardinalität des ersten Schlüsselteils beträgt dann 10, die des gesamten Schlüssels 500. Die Anzahl unterschiedlicher Länder darf nicht einfach mit der Anzahl unterschiedlicher Städte multipliziert werden, denn nicht jede mögliche Kombination muss in der Tabelle vorkommen.
Manche Werkzeuge zeigen separate Schätzwerte für die aufeinanderfolgenden Präfixe des Index, also seine jeweils ersten Spalten. In MySQL muss das Feld Cardinality im Ergebnis von SHOW INDEX zusammen mit der durch Seq_in_index angegebenen Spaltenposition betrachtet werden: Die Schätzung bezieht sich auf das Indexpräfix, das an dieser Position endet.
Auch die Reihenfolge der Spalten beeinflusst, wofür sich der Index einsetzen lässt. Bei einem typischen B-tree-Index, also einem Index mit geordneter Baumstruktur, unterstützt (land, stadt) die Suche nach dem Land sowie nach Land und Stadt. Eine Suche ausschließlich nach der Stadt kann einen anderen Zugriffsweg erfordern; welche Optimierungen verfügbar sind, hängt von der Engine ab.
Warum eine hohe Kardinalität nicht ausreicht
Ein Index auf einer Spalte mit nahezu eindeutigen Werten kann für den Vergleich mit einem bestimmten Wert gut geeignet sein, für einen großen Wertebereich jedoch weniger nützlich. Eine Abfrage, die anhand des Datums den Großteil der Datensätze abruft, nutzt den Index möglicherweise nicht, obwohl viele unterschiedliche Datumswerte vorhanden sind.
Auch die Formulierung der Bedingung spielt eine Rolle. Wird eine Funktion auf die indexierte Spalte angewendet, beispielsweise um aus einem Datum nur das Jahr zu gewinnen, kann das die Nutzung eines gewöhnlichen Index erschweren. Ob ein funktionsbasierter Index verwendet oder die Abfrage entsprechend umgeschrieben werden kann, muss für die jeweilige Engine geprüft werden.
Ein Index kann außerdem beim Sortieren, beim Verknüpfen von Tabellen oder beim Lesen von Daten ohne Zugriff auf die Tabelle helfen, sofern er alle benötigten Spalten enthält. Eine niedrige Kardinalität ist daher allein kein Grund, einen Index zu entfernen. Auch seine Kosten müssen berücksichtigt werden: der belegte Speicherplatz und der zusätzliche Aufwand beim Schreiben und Aktualisieren von Daten.
So prüfst du, ob ein Index hilft
Bewerte einen Index anhand einer tatsächlichen Abfrage, nicht allein anhand der Zahl in der Verwaltungsoberfläche:
- Wähle eine typische Abfrage und repräsentative Parameterwerte, darunter sowohl häufige als auch seltene Werte.
- Prüfe den Ausführungsplan mit
EXPLAINoder dem entsprechenden Befehl deiner Engine. - Achte auf den gewählten Index, die geschätzte Zeilenzahl und die Art des Tabellenzugriffs.
- Vergleiche die Schätzungen mit der tatsächlichen Ausführung, sofern dies sicher möglich ist. Bedenke, dass Befehle zur Analyse der Ausführung die Abfrage tatsächlich ausführen können.
- Prüfe bei großen Abweichungen, ob die Statistiken aktuell sind, und lies in der Datenbankdokumentation nach, wie sie aktualisiert werden.
Nach einem Massenimport, dem Löschen von Datensätzen oder einer Änderung der Werteverteilung spiegeln die Statistiken möglicherweise nicht mehr die aktuellen Daten wider. Prüfe vor dem Anlegen eines weiteren Index den Plan der problematischen Abfrage und den Stand der Statistiken. So lässt sich unterscheiden, ob ein geeigneter Index fehlt oder die Kosten falsch geschätzt werden.
Siehe auch: Was ist FireFox?
