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_id
11, então o que isso significa?
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_id
11, então o que isso significa?
Respostas:
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.
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.
É 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.
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.
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:
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.
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)