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

Cardinalidad del índice MySQL:rendimiento frente a eficiencia de almacenamiento

Una mayor cardinalidad significa un mejor rendimiento de lectura porque, por definición, hay menos registros para leer.

Para procesar una consulta como esta:

SELECT  *
FROM    mytable
WHERE   indexed_col = @myvalue

, el motor debe realizar los siguientes pasos:

  1. Encuentre la primera entrada que cumpla la condición.

    Esto se hace atravesando el B-Tree , a partir de la entrada raíz.

    En las páginas, la búsqueda se realiza siguiendo B-Tree Enlaces; dentro de una página, la búsqueda se realiza mediante búsqueda binaria (a menos que sus claves estén comprimidas, en cuyo caso es una búsqueda lineal).

    Este algoritmo tiene la misma eficiencia para las columnas de cardinalidad alta y baja. Encontrar el primer 3 (a diferencia de cualquier 3 ) en estas listas:

    1  2  3  4  5  6  7  8  9  10
    
    3  3  3  3  3  3  3  3  4  4
    

    requiere el mismo O(log(n)) pasos.

  2. Atravesar el índice hasta que cambie el valor de la clave. Esto, por supuesto, requiere un tiempo lineal:cuantos más registros tenga, más tendrá que atravesar.

Si solo necesita el primer registro:

SELECT  *
FROM    mytable
WHERE   indexed_col = @myvalue
LIMIT 1

, la cardinalidad de la columna no afecta el rendimiento de lectura.

Cada clave de índice tiene un valor adicional oculto:un puntero de registro. Este es el objetivo de tener un índice:necesita saber a qué registro apunta.

Dado que un puntero de registro, por definición, es único, cada clave de índice también es única. Las entradas de índice que comparten el mismo valor de clave se ordenan por el puntero de registro.

Esto es para que el índice se pueda mantener:si elimina un registro con un valor de una columna indexada compartida por un millón de otros registros, el registro de índice correspondiente también debe eliminarse. Pero no se revisa el millón completo de registros del índice:en su lugar, el puntero del registro se usa como una condición de búsqueda adicional.

De hecho, cada clave de índice es única (incluso si no define el índice como único) y, por lo tanto, tiene la máxima cardinalidad posible.

Entonces, la respuesta a sus preguntas es:no, la cardinalidad de la columna no afecta el rendimiento de escritura del índice.