Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pourquoi la cardinalité d'un index dans MySQL reste-t-elle inchangée lorsque j'ajoute un nouvel index ?

Si vous n'avez qu'une seule ligne dans la table, la cardinalité de l'index doit être 1, bien sûr. Il s'agit simplement de compter le nombre de valeurs uniques.

Si vous considérez un index comme une table de recherche basée sur des compartiments (comme un hachage), alors la cardinalité est le nombre de compartiments.

Voici comment cela fonctionne :lorsque vous créez un index sur un ensemble de colonnes (a,b,c,d) , puis la base de données parcourt toutes les lignes du tableau, en examinant les quadruplets ordonnés de ces 4 colonnes, pour chaque ligne. Imaginons que votre tableau ressemble à ceci :

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

Donc, ce que la base de données regarde, ce sont juste les 4 colonnes (a,b,c,d) :

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

Vous voyez qu'il ne reste que 3 lignes uniques ? Ceux-ci deviendront nos seaux, mais nous y reviendrons. En réalité, il existe également un identifiant d'enregistrement ou un identifiant de ligne pour chaque ligne de la table. Notre tableau d'origine ressemble donc à ceci :

(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

Ainsi, lorsque nous ne regardons que les 4 colonnes de (a,b,c,d), nous regardons également l'identifiant de la ligne :

(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

Mais nous voulons faire une recherche par (a,b,c,d) et non par id de ligne, donc nous produisons quelque chose comme ceci :

(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

Et enfin, nous regroupons tous les identifiants de ligne des lignes qui ont des valeurs identiques (a,b,c,d) :

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

Regarde ça? Les valeurs de (a,b,c,d), qui sont (1,1,1,1) (1,2,1,1) et (1,3,1,1) sont devenues des clés pour notre table de recherche dans les lignes du tableau d'origine.

En fait, rien de tout cela ne se produit vraiment, mais cela devrait vous donner une bonne idée de la manière dont une implémentation "naïve" (c'est-à-dire directe) d'un index peut être effectuée.

Mais l'essentiel est le suivant :la cardinalité mesure simplement le nombre de lignes uniques qu'il y a dans un index. Et dans notre exemple, c'était le nombre de clés dans notre table de recherche, qui était de 3.

J'espère que ça aide !