web-dev-qa-db-fra.com

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

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, dites group_id comme 11, alors qu'est-ce que cela signifie?

101
OM The Eternity

Cardinalité maximale: toutes les valeurs sont uniques

Cardinalité min .: Toutes les valeurs sont les mêmes

Certaines colonnes sont appelées colonnes à haute cardinalité car elles ont des contraintes (comme uniques) qui vous empêchent de mettre la même valeur dans chaque ligne.

La cardinalité est une propriété qui affecte la possibilité de regrouper, trier et rechercher des données. Il s’agit donc d’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.

115

Wikipedia résume cardinalité en SQL comme suit:

Dans SQL (Langage de requête structuré), le terme cardinalité désigne le - nicité des valeurs de données contenues dans une colonne particulière (attribut) d'un base de donnéestable . Plus la cardinalité est basse, plus il y a d'éléments dupliqués dans une colonne. Ainsi, une colonne avec la cardinalité la plus basse possible aurait la même valeur pour chaque ligne. Les bases de données SQL utilisent la cardinalité pour déterminer l’optimum plan de requête pour une requête donnée.

32
Kami

C'est 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 .

24
Rhapsody

Cela est essentiellement associé au degré d'unicité des valeurs d'une colonne, conformément à l'article de Wikipedia lié à Kami.

Pourquoi est-il important de considérer 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 suffisamment sélectif pour être utilisé.

15
Martin Smith

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, les valeurs de cordinalité plus élevées signifient:

  • meilleure performance des requêtes de lecture;
  • plus grande taille de la base de données;
  • dégradation des performances des requêtes en écriture, car les données d'index masquées sont mises à jour.
10
Zon

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" soit: A = {1,2,3} - la cardinalité de cet ensemble est | 3 |.

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

Cela signifie dans le contexte de mysql 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), la cardinalité de cette colonne vous indiquera le nombre de lignes que contient la table, car il existe un ID unique pour chaque ligne de la table. Vous n'avez pas besoin de faire un "COUNT (*)" sur cette table pour savoir combien de lignes il a, regardez simplement la cardinalité.

7
user3112246

De manière simple, la cardinalité est le nombre de lignes ou de tuples dans la table. Le nombre de colonnes s'appelle "degré"

4
Aayush

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 de statistiques stockées sous forme d'entiers. La valeur n'est donc pas nécessairement exacte, même pour les petites tables. Plus la cardinalité est élevée, plus il est probable que MySQL utilise l'index lors des jointures.

Et un 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)
4
Junjie Li