Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Indexkardinalität – Leistung vs. Speichereffizienz

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:

  1. 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 allen 3 ) 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.

  2. 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.