¿Qué es la cardinalidad en MySQL? Explique en un lenguaje sencillo y no técnico.
Si un detalle de índice de cualquier tabla muestra la cardinalidad de un campo, digamos group_id
11, ¿qué significa eso?
¿Qué es la cardinalidad en MySQL? Explique en un lenguaje sencillo y no técnico.
Si un detalle de índice de cualquier tabla muestra la cardinalidad de un campo, digamos group_id
11, ¿qué significa eso?
Respuestas:
Cardinalidad máxima: todos los valores son únicos
Cardinalidad mínima: todos los valores son iguales
Algunas columnas se denominan columnas de cardinalidad alta porque tienen restricciones (como únicas) que le prohíben poner el mismo valor en cada fila.
La cardinalidad es una propiedad que afecta la capacidad de agrupar, ordenar y buscar datos. Por tanto, es una medida importante para los planificadores de consultas en bases de datos, es una heurística que pueden utilizar para elegir los mejores planes.
Wikipedia resume la cardinalidad en SQL de la siguiente manera:
En SQL (lenguaje de consulta estructurado), el término cardinalidad se refiere a la singularidad de los valores de datos contenidos en una columna (atributo) particular de una tabla de base de datos . Cuanto menor sea la cardinalidad, más elementos duplicados en una columna. Por tanto, una columna con la cardinalidad más baja posible tendría el mismo valor para cada fila. Las bases de datos SQL utilizan la cardinalidad para ayudar a determinar el plan de consulta óptimo para una consulta determinada.
Es una estimación del número de valores únicos en el índice.
Para una tabla con una sola columna de clave primaria, la cardinalidad normalmente debe ser igual al número de filas de la tabla.
Básicamente, está asociado con el grado de singularidad de los valores de una columna según el artículo de Wikipedia vinculado por Kami.
Por qué es importante tenerlo en cuenta es que afecta la estrategia de indexación. No tendrá mucho sentido indexar una columna de cardinalidad baja con solo 2 valores posibles, ya que el índice no será lo suficientemente selectivo como para ser utilizado.
Cuanto mayor sea la cardinalidad, mejor será la diferenciación de filas. La diferenciación ayuda a navegar por menos sucursales para obtener datos.
Por lo tanto, valores de cordinalidad más altos significan:
En términos matemáticos, la cardinalidad es el recuento de valores en un conjunto de valores. Un conjunto solo puede contener valores únicos. Un ejemplo sería el conjunto "A".
Sea el conjunto "A": A = {1,2,3} - la cardinalidad de ese conjunto es | 3 |.
Si el conjunto "A" contiene 5 valores A = {10,21,33,42,57}, entonces la cardinalidad es | 5 |.
Lo que eso significa en el contexto de mysql es que la cardinalidad de una columna de la tabla es el recuento de los valores únicos de esa columna. Si está mirando la cardinalidad de su columna de clave principal (por ejemplo, table.id), entonces la cardinalidad de esa columna le dirá cuántas filas contiene esa tabla, ya que hay una ID única para cada fila en la tabla. No tiene que realizar un "COUNT (*)" en esa tabla para averiguar cuántas filas tiene, simplemente mire la cardinalidad.
Del manual :
Cardinalidad
Una estimación del número de valores únicos en el índice. Esto se actualiza ejecutando ANALYZE TABLE o myisamchk -a. La cardinalidad se cuenta en función de las estadísticas almacenadas como números enteros, por lo que el valor no es necesariamente exacto incluso para tablas pequeñas. Cuanto mayor sea la cardinalidad, mayor será la probabilidad de que MySQL utilice el índice al realizar uniones.
Y un análisis de Percona :
CREATE TABLE `antest` (
`i` int(10) unsigned NOT NULL,
`c` char(80) default NULL,
KEY `i` (`i`),
KEY `c` (`c`,`i`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
mysql> select count(distinct c) from antest;
+-------------------+
| count(distinct c) |
+-------------------+
| 101 |
+-------------------+
1 row in set (0.36 sec)
mysql> select count(distinct i) from antest;
+-------------------+
| count(distinct i) |
+-------------------+
| 101 |
+-------------------+
1 row in set (0.20 sec)
mysql> select count(distinct i,c) from antest;
+---------------------+
| count(distinct i,c) |
+---------------------+
| 10201 |
+---------------------+
1 row in set (0.43 sec)
mysql> show index from antest;
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| antest | 1 | i | 1 | i | A | NULL | NULL | NULL | | BTREE | |
| antest | 1 | c | 1 | c | A | NULL | NULL | NULL | YES | BTREE | |
| antest | 1 | c | 2 | i | A | NULL | NULL | NULL | | BTREE | |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
3 rows in set (0.00 sec)
mysql> analyze table sys_users;
+--------------------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------------------------+---------+----------+----------+
| antest | analyze | status | OK |
+--------------------------------+---------+----------+----------+
1 row in set (0.01 sec)
mysql> show index from antest;
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| antest | 1 | i | 1 | i | A | 101 | NULL | NULL | | BTREE | |
| antest | 1 | c | 1 | c | A | 101 | NULL | NULL | YES | BTREE | |
| antest | 1 | c | 2 | i | A | 10240 | NULL | NULL | | BTREE | |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
3 rows in set (0.01 sec)