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

Warum bleibt die Kardinalität eines Index in MySQL unverändert, wenn ich einen neuen Index hinzufüge?

Wenn Sie nur 1 Zeile in der Tabelle haben, sollte die Kardinalität für den Index natürlich 1 sein. Es wird nur die Anzahl der eindeutigen Werte gezählt.

Wenn Sie sich einen Index als eine auf Buckets basierende Nachschlagetabelle (wie einen Hash) vorstellen, dann ist die Kardinalität die Anzahl der Buckets.

So funktioniert es:Wenn Sie einen Index über eine Reihe von Spalten (a,b,c,d) erstellen , dann geht die Datenbank alle Zeilen in der Tabelle durch und betrachtet die geordneten Quadrupel dieser 4 Spalten für jede Zeile. Nehmen wir an, Ihre Tabelle sieht so aus:

a  b  c  d  e   
-- -- -- -- --  
1  1  1  1  200 
1  1  1  1  300
1  2  1  1  200
1  3  1  1  200

Was die Datenbank also betrachtet, sind nur die 4 Spalten (a,b,c,d):

a  b  c  d  
-- -- -- --
1  1  1  1 
1  2  1  1 
1  3  1  1 

Sehen Sie, dass nur noch 3 eindeutige Zeilen übrig sind? Das werden unsere Eimer, aber wir kommen darauf zurück. In Wirklichkeit gibt es auch eine Datensatz-ID oder Zeilenkennung für jede Zeile in der Tabelle. Unsere ursprüngliche Tabelle sieht also so aus:

(row id) a  b  c  d  e   
-------- -- -- -- -- --  
00000001 1  1  1  1  200 
00000002 1  1  1  1  300
00000003 1  2  1  1  200
00000004 1  3  1  1  200

Wenn wir uns also nur die 4 Spalten von (a,b,c,d) ansehen, sehen wir uns eigentlich auch die Zeilen-ID an:

(row id) a  b  c  d 
-------- -- -- -- --
00000001 1  1  1  1
00000002 1  1  1  1
00000003 1  2  1  1
00000004 1  3  1  1

Aber wir wollen nach (a,b,c,d) und nicht nach Zeilen-ID suchen, also produzieren wir so etwas:

(a,b,c,d) (row id)
--------- --------
1,1,1,1   00000001
1,1,1,1   00000002
1,2,1,1   00000003
1,3,1,1   00000004

Und schließlich gruppieren wir alle Zeilen-IDs von Zeilen, die identische (a,b,c,d)-Werte haben:

(a,b,c,d) (row id)
--------- ---------------------
1,1,1,1   00000001 and 00000002
1,2,1,1   00000003
1,3,1,1   00000004

Siehst du das? Die Werte von (a,b,c,d), die (1,1,1,1) (1,2,1,1) und (1,3,1,1) sind, sind zu Schlüsseln für unsere Nachschlagetabelle geworden in die Zeilen der Originaltabelle.

Eigentlich passiert nichts davon wirklich, aber es sollte Ihnen eine gute Vorstellung davon geben, wie eine "naive" (d.h. geradlinige) Implementierung eines Index durchgeführt werden könnte.

Aber das Fazit ist folgendes:Die Kardinalität misst nur, wie viele eindeutige Zeilen in einem Index vorhanden sind. Und in unserem Beispiel war das die Anzahl der Schlüssel in unserer Nachschlagetabelle, nämlich 3.

Hoffe das hilft!