Eine höhere Kardinalität bedeutet eine bessere Leseleistung, da per Definition weniger Datensätze gelesen werden müssen.
So verarbeiten Sie eine Abfrage wie folgt:
SELECT *
FROM mytable
WHERE indexed_col = @myvalue
, sollte die Engine die folgenden Schritte ausführen:
-
Finden Sie den ersten Eintrag, der die Bedingung erfüllt.
Dies geschieht durch Traversieren des
B-Tree
, beginnend mit dem Root-Eintrag.Seitenübergreifend wird die Suche durchgeführt, indem dem
B-Tree
gefolgt wird Verknüpfungen; Innerhalb einer Seite wird die Suche mit binärer Suche durchgeführt (es sei denn, Ihre Schlüssel sind komprimiert, in diesem Fall ist es eine lineare Suche).Dieser Algorithmus hat dieselbe Effizienz für Spalten mit hoher und niedriger Kardinalität. Finden der ersten
3
(im Gegensatz zu allen3
) in diesen Listen:1 2 3 4 5 6 7 8 9 10 3 3 3 3 3 3 3 3 4 4
erfordert denselben
O(log(n))
Schritte. -
Durchlaufen des Index, bis sich der Schlüsselwert ändert. Dies erfordert natürlich lineare Zeit:Je mehr Datensätze Sie haben, desto mehr müssen Sie durchlaufen.
Wenn Sie nur den ersten Datensatz benötigen:
SELECT *
FROM mytable
WHERE indexed_col = @myvalue
LIMIT 1
, wirkt sich die Spaltenkardinalität nicht auf die Leseleistung aus.
Jeder Indexschlüssel hat einen versteckten zusätzlichen Wert:einen Datensatzzeiger. Das ist der springende Punkt bei einem Index:Sie müssen wissen, auf welchen Datensatz er zeigt.
Da ein Datensatzzeiger per Definition eindeutig ist, ist auch jeder Indexschlüssel eindeutig. Die Indexeinträge mit demselben Schlüsselwert werden nach dem Datensatzzeiger sortiert.
Dies dient dazu, den Index wartbar zu machen:Wenn Sie einen Datensatz mit einem Wert einer indizierten Spalte löschen, der von einer Million anderer Datensätze gemeinsam genutzt wird, sollte der entsprechende Indexdatensatz ebenfalls gelöscht werden. Dabei wird aber nicht die ganze Million der Indexsätze durchsucht, sondern der Satzzeiger als zusätzliche Suchbedingung verwendet.
Jeder Indexschlüssel ist tatsächlich eindeutig (auch wenn Sie den Index nicht als eindeutig definieren) und hat daher die maximal mögliche Kardinalität.
Die Antwort auf Ihre Fragen lautet also:Nein, die Spaltenkardinalität wirkt sich nicht auf die Indexschreibleistung aus.