O que é cardinalidade no MySQL?

106

O que é cardinalidade no MySQL? Explique em linguagem simples e não técnica.

Se um detalhe de índice de qualquer tabela exibe a cardinalidade de um campo, digamos group_id11, então o que isso significa?

OM The Eternity
fonte

Respostas:

120

Cardinalidade máxima: todos os valores são únicos

Cardinalidade mínima: todos os valores são iguais

Algumas colunas são chamadas de colunas de alta cardinalidade porque possuem restrições (como únicas) que proíbem você de colocar o mesmo valor em todas as linhas.

A cardinalidade é uma propriedade que afeta a capacidade de agrupar, classificar e pesquisar dados. É, portanto, uma medida importante para os planejadores de consulta em bancos de dados, é uma heurística que eles podem usar para escolher os melhores planos.

Alexander Torstling
fonte
10
O que há com esse fetiche por palavras grandes. "Distinção" funcionaria bem, não é?
Pacerier 01 de
8
@Pacerier: Sim, embora eu ache que as pessoas que trabalham com bancos de dados já estejam bastante familiarizadas com a teoria relacional, a teoria dos conjuntos e a matemática. E eles pegaram emprestado o termo da teoria dos conjuntos: en.m.wikipedia.org/wiki/Cardinality
Alexander Torstling
27
@Pacerier, Distinção é uma palavra maior (por 1)
Drew em
4
@Drew,;) não se estiver comparando lexemas.
Pacerier,
8
@Pacerier Lexeme? "Distinção" funcionaria lá também, não é? ;) Se trabalharmos bastante, podemos reduzir todo o idioma a apenas 1 palavra e nos expressar por meio de repetições e pausas variadas.
Jason
34

A Wikipedia resume a cardinalidade em SQL da seguinte maneira:

Em SQL (Structured Query Language), o termo cardinalidade refere-se à exclusividade dos valores de dados contidos em uma determinada coluna (atributo) de uma tabela de banco de dados . Quanto menor a cardinalidade, mais elementos duplicados em uma coluna. Assim, uma coluna com a menor cardinalidade possível teria o mesmo valor para todas as linhas. Os bancos de dados SQL usam cardinalidade para ajudar a determinar o plano de consulta ideal para uma determinada consulta.

Kami
fonte
25

É uma estimativa do número de valores únicos no índice.

Para uma tabela com uma única coluna de chave primária, a cardinalidade normalmente deve ser igual ao número de linhas na tabela.

Mais informações .

Rapsódia
fonte
15

Está basicamente associado ao grau de exclusividade dos valores de uma coluna de acordo com o artigo da Wikipedia vinculado por Kami.

É importante considerar que isso afeta a estratégia de indexação. Não haverá muito sentido em indexar uma coluna de baixa cardinalidade com apenas 2 valores possíveis, pois o índice não será seletivo o suficiente para ser usado.

Martin Smith
fonte
4
O segundo parágrafo é importante se você tentar entender quando faz sentido indexar uma coluna.
VMC
10

Quanto maior a cardinalidade, melhor é a diferenciação das linhas. A diferenciação ajuda a navegar menos ramos para obter dados.

Portanto, valores de cordinalidade mais altos significam:

  • melhor desempenho de consultas de leitura;
  • maior tamanho do banco de dados;
  • pior desempenho de consultas de gravação, porque os dados de índice ocultos estão sendo atualizados.
Zon
fonte
7

Em termos matemáticos, cardinalidade é a contagem de valores em um conjunto de valores. Um conjunto só pode conter valores únicos. Um exemplo seria o conjunto "A".

Seja o conjunto "A": A = {1,2,3} - a cardinalidade desse conjunto é | 3 |.

Se o conjunto "A" contém 5 valores A = {10,21,33,42,57}, então a cardinalidade é | 5 |.

O que isso significa no contexto do mysql é que a cardinalidade de uma coluna da tabela é a contagem dos valores únicos dessa coluna. Se você estiver observando a cardinalidade de sua coluna de chave primária (por exemplo, table.id), então a cardinalidade dessa coluna lhe dirá quantas linhas aquela tabela contém, já que há um ID único para cada linha na tabela. Você não precisa executar um "COUNT (*)" nessa tabela para descobrir quantas linhas ela tem, simplesmente observe a cardinalidade.

user3112246
fonte
4

De forma simples, cardinalidade é o número de linhas ou tuplas dentro da tabela. O número de colunas é chamado de "grau"

Aayush
fonte
4

Do manual :

Cardinalidade

Uma estimativa do número de valores únicos no índice. Isso é atualizado executando ANALYZE TABLE ou myisamchk -a. A cardinalidade é contada com base em estatísticas armazenadas como números inteiros, portanto, o valor não é necessariamente exato, mesmo para tabelas pequenas. Quanto maior a cardinalidade, maior a chance de o MySQL usar o índice ao fazer junções.

E uma análise da 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
fonte
1
Esta resposta não contém nenhum conteúdo escrito por você, é apenas uma colagem do manual do MySQL e do post do blog ao qual você fez um link. E horrivelmente formatado em cima disso.
Siguza,
1
Agora diz claramente as fontes e está melhor formatado.
carla