¿Qué es la cardinalidad en MySQL?

106

¿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_id11, ¿qué significa eso?

OM la eternidad
fuente

Respuestas:

120

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.

Alexander Torstling
fuente
10
¿Qué pasa con este fetiche por las grandes palabras? La "distinción" funcionaría bien, ¿no?
Pacerier
8
@Pacerier: Sí, aunque creo que las personas que trabajan con bases de datos ya están bastante familiarizadas con la teoría relacional, la teoría de conjuntos y las matemáticas. Y tomaron prestado el término de la teoría de conjuntos: en.m.wikipedia.org/wiki/Cardinality
Alexander Torstling
27
@Pacerier, Distinctness es una palabra más grande (por 1)
Drew
4
@Drew,;) no si se comparan lexemas.
Pacerier
8
@Pacerier Lexeme? La "distinción" también funcionaría allí, ¿no? ;) Si trabajamos lo suficiente, podemos reducir todo el lenguaje a una sola palabra y expresarnos a través de diferentes repeticiones y pausas.
Jason
34

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.

Kami
fuente
25

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.

Más información .

Rapsodia
fuente
15

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.

Martin Smith
fuente
4
El segundo párrafo es importante si intenta comprender cuándo tiene sentido indexar una columna.
VMC
10

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:

  • mejor rendimiento de consultas de lectura;
  • mayor tamaño de la base de datos;
  • peor rendimiento de las consultas de escritura, porque se actualizan los datos de índice ocultos.
Zon
fuente
7

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.

user3112246
fuente
4

De manera simple, la cardinalidad es el número de filas o tuplas dentro de la tabla. El número de columnas se denomina "grado"

Aayush
fuente
4

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)
Junjie Li
fuente
1
Esta respuesta contiene cero contenido que haya escrito usted mismo, es solo un collage del manual de MySQL y la publicación del blog a la que se vinculó. Y horriblemente formateado además de eso.
Siguza
1
Ahora dice claramente las fuentes y está mejor formateado.
carla