¿Qué es cardinality en MySQL?


¿Qué es cardinalidad en MySQL? Por favor, explíquelo 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 como 11, entonces ¿qué significa eso?

 90
Author: halfer, 2010-04-02

8 answers

Cardinalidad máxima: Todos los valores son únicos

Cardinalidad mínima: Todos los valores son los mismos

Algunas columnas se llaman columnas de alta cardinalidad porque tienen restricciones (como unique) que le prohíben poner el mismo valor en cada fila.

Cardinality es una propiedad que afecta la capacidad de agrupar, ordenar y buscar datos. Por lo tanto, es una medida importante para los planificadores de consultas en DBs, es una heurística que pueden usar para elegir la mejor plan.

 106
Author: Alexander Torstling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-02 10:55:44

Wikipedia resume 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 particular (atributo) de una base de datos cuadro . Cuanto menor sea la cardinalidad, más elementos duplicados habrá en una columna. Por lo tanto, una columna con la menor cardinalidad posible tendría el mismo valor para cada fila. Las bases de datos SQL utilizan cardinality para ayuda a determinar el plan de consulta óptimo para una consulta dada.

 30
Author: Kami,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-19 00:34:43

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 debería ser normalmente igual al número de filas de la tabla.

Más información.

 22
Author: Rhapsody,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-02 10:49:34

Básicamente se asocia 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 tener en cuenta es que afecta a la estrategia de indexación. Habrá poco punto indexando una columna de baja cardinalidad con solo 2 valores posibles, ya que el índice no será lo suficientemente selectivo como para ser utilizado.

 14
Author: Martin Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-02 10:56:38

Cuanto mayor es la cardinalidad, mejor es la diferenciación de filas. La diferenciación ayuda a navegar menos ramas para obtener datos.

Por lo tanto, los valores de cordinalidad más altos significan:

  • mejor rendimiento de las consultas de lectura;
  • mayor tamaño de la base de datos;
  • peor rendimiento de las consultas de escritura, porque los datos del índice oculto se están actualizando.
 6
Author: Zon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-14 07:37:46

De manera sencilla, cardinalidad es el número de filas o tuplas dentro de la tabla. No. de columnas se llama "grado"

 4
Author: Aayush,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-21 13:40:59

En términos matemáticos, cardinalidad es la cuenta 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 tabla es el recuento de los valores únicos de esa columna. Si usted está mirando el cardinalidad de su columna de clave primaria (por ejemplo. table.id), entonces la cardinalidad de esa columna le dirá cuántas filas contiene la tabla, ya que hay un ID único para cada fila en la tabla. No tienes que realizar un "COUNT (*)" en esa tabla para averiguar cuántas filas tiene, simplemente mira la cardinalidad.

 4
Author: user3112246,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-05 09:40:38

Del manual :

Cardinalidad

Una estimación del número de valores únicos en el índice. Esto es actualizado mediante la ejecución de ANALIZAR TABLA o myisamchk-a. Cardinality es contado basado en estadísticas almacenadas como enteros, por lo que el valor no es necesariamente exacto incluso para mesas pequeñas. Cuanto mayor sea la cardinalidad, cuanto mayor sea la probabilidad de que MySQL utilice el índice al hacer 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)
 3
Author: Junjie Li,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-05 02:44:10