Qu'est-ce que la cardinalité dans MySQL?

106

Qu'est-ce que la cardinalité dans MySQL? Veuillez expliquer dans un langage simple et non technique.

Si un détail d'index d'une table affiche la cardinalité d'un champ, par exemple group_id11, qu'est-ce que cela signifie?

OM l'éternité
la source

Réponses:

120

Cardinalité maximale: toutes les valeurs sont uniques

Cardinalité minimale: toutes les valeurs sont identiques

Certaines colonnes sont appelées colonnes à cardinalité élevée car elles ont des contraintes en place (comme unique) vous interdisant de mettre la même valeur dans chaque ligne.

La cardinalité est une propriété qui affecte la capacité à regrouper, trier et rechercher des données. C'est donc une mesure importante pour les planificateurs de requêtes dans les bases de données, c'est une heuristique qu'ils peuvent utiliser pour choisir les meilleurs plans.

Alexander Torstling
la source
10
C'est quoi ce fétiche des grands mots. "Distinction" fonctionnerait bien, n'est-ce pas?
Pacerier
8
@Pacerier: Oui, même si je pense que les gens qui travaillent sur des bases de données connaissent déjà assez bien la théorie relationnelle, la théorie des ensembles et les mathématiques. Et ils ont emprunté le terme à la théorie des ensembles: en.m.wikipedia.org/wiki/Cardinality
Alexander Torstling
27
@Pacerier, La distinction est un mot plus grand (par 1)
Tiré le
4
@Drew,;) pas si vous comparez des lexèmes.
Pacerier
8
@Pacerier Lexeme? La "distinction" fonctionnerait là aussi, n'est-ce pas? ;) Si nous travaillons assez dur, nous pouvons réduire la langue entière à un seul mot et nous exprimer par des répétitions et des pauses variables.
Jason
34

Wikipedia résume la cardinalité en SQL comme suit:

En SQL (Structured Query Language), le terme cardinalité fait référence à l' unicité des valeurs de données contenues dans une colonne particulière (attribut) d'une table de base de données . Plus la cardinalité est faible, plus il y a d'éléments dupliqués dans une colonne. Ainsi, une colonne avec la cardinalité la plus faible possible aurait la même valeur pour chaque ligne. Les bases de données SQL utilisent la cardinalité pour aider à déterminer le plan de requête optimal pour une requête donnée.

Kami
la source
25

Il s'agit d'une estimation du nombre de valeurs uniques dans l'index.

Pour une table avec une seule colonne de clé primaire, la cardinalité doit normalement être égale au nombre de lignes de la table.

Plus d'informations .

Rhapsodie
la source
15

Il est fondamentalement associé au degré d'unicité des valeurs d'une colonne selon l'article Wikipédia lié à par Kami.

Il est important de tenir compte du fait que cela affecte la stratégie d'indexation. Il y aura peu de points d'indexation d'une colonne à faible cardinalité avec seulement 2 valeurs possibles car l'index ne sera pas assez sélectif pour être utilisé.

Martin Smith
la source
4
Le deuxième paragraphe est important si vous essayez de comprendre quand il est judicieux d'indexer une colonne.
VMC
10

Plus la cardinalité est élevée, meilleure est la différenciation des lignes. La différenciation permet de parcourir moins de branches pour obtenir des données.

Par conséquent, des valeurs de cordinalité plus élevées signifient:

  • meilleures performances des requêtes de lecture;
  • plus grande taille de base de données;
  • pires performances des requêtes d'écriture, car les données d'index masquées sont mises à jour.
Zon
la source
7

En termes mathématiques, la cardinalité est le nombre de valeurs dans un ensemble de valeurs. Un ensemble ne peut contenir que des valeurs uniques. Un exemple serait l'ensemble "A".

Soit l'ensemble "A": A = {1,2,3} - la cardinalité de cet ensemble est | 3 |.

Si l'ensemble "A" contient 5 valeurs A = {10,21,33,42,57}, alors la cardinalité est | 5 |.

Ce que cela signifie dans le contexte de mysql est que la cardinalité d'une colonne de table est le nombre de valeurs uniques de cette colonne. Si vous regardez la cardinalité de votre colonne de clé primaire (par exemple, table.id), alors la cardinalité de cette colonne vous indiquera combien de lignes cette table contient, car il y a un ID unique pour chaque ligne de la table. Vous n'avez pas besoin d'effectuer un "COUNT (*)" sur cette table pour savoir combien de lignes elle a, regardez simplement la cardinalité.

user3112246
la source
4

D'une manière simple, la cardinalité est le nombre de lignes ou de tuples dans la table. Le nombre de colonnes est appelé "degré"

Aayush
la source
4

À partir du manuel :

Cardinalité

Une estimation du nombre de valeurs uniques dans l'index. Ceci est mis à jour en exécutant ANALYZE TABLE ou myisamchk -a. La cardinalité est comptée en fonction des statistiques stockées sous forme d'entiers, de sorte que la valeur n'est pas nécessairement exacte, même pour les petites tables. Plus la cardinalité est élevée, plus il y a de chances que MySQL utilise l'index lors des jointures.

Et une analyse 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
la source
1
Cette réponse ne contient aucun contenu que vous avez écrit vous-même, c'est juste un collage du manuel MySQL et du billet de blog auquel vous avez lié. Et horriblement formaté en plus.
Siguza
1
Maintenant, il indique clairement les sources et il est mieux formaté.
carla