sql >> Base de Datos >  >> RDS >> Mysql

¿Por qué la cardinalidad de un índice en MySQL permanece sin cambios cuando agrego un nuevo índice?

Si solo tiene 1 fila en la tabla, la cardinalidad del índice debe ser 1, por supuesto. Es solo contar el número de valores únicos.

Si piensa en un índice como una tabla de búsqueda basada en cubos (como un hash), entonces la cardinalidad es la cantidad de cubos.

Así es como funciona:cuando crea un índice sobre un conjunto de columnas (a,b,c,d) , luego la base de datos recorre todas las filas de la tabla, observando los cuatrillizos ordenados de esas 4 columnas, para cada fila. Digamos que su tabla se ve así:

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

Entonces, lo que mira la base de datos son solo las 4 columnas (a,b,c,d):

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

¿Ves que solo quedan 3 filas únicas? Esos se convertirán en nuestros cubos, pero volveremos a eso. En realidad, también hay una identificación de registro o identificador de fila para cada fila de la tabla. Así que nuestra tabla original se ve así:

(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

Entonces, cuando miramos solo las 4 columnas de (a,b,c,d), también estamos mirando la identificación de la fila:

(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

Pero queremos buscar por (a,b,c,d) y no por ID de fila, por lo que producimos algo como esto:

(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

Y finalmente, agrupamos todos los ID de fila de las filas que tienen valores idénticos (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

¿Mira eso? Los valores de (a,b,c,d), que son (1,1,1,1) (1,2,1,1) y (1,3,1,1) se han convertido en claves para nuestra tabla de búsqueda en las filas de la tabla original.

En realidad, nada de esto sucede realmente, pero debería darle una buena idea de cómo se podría hacer una implementación "ingenua" (es decir, sencilla) de un índice.

Pero la conclusión es esta:la cardinalidad solo mide cuántas filas únicas hay en un índice. Y en nuestro ejemplo, ese era el número de claves en nuestra tabla de búsqueda, que era 3.

¡Espero que eso ayude!