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 disons group_id tant que 11, qu’est-ce que cela signifie?

Max cardinalité: Toutes les valeurs sont uniques

Cardinalité minimale: Toutes les valeurs sont identiques

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

La cardinalité est une propriété qui affecte la capacité à regrouper, sortinger 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.

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

Dans SQL (Structured Query Language), le terme cardinalité fait référence à l’ unicité des valeurs de données contenues dans une colonne particulière (atsortingbut) d’une table de firebase database . 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 déterminer le plan de requête optimal pour une requête donnée.

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

Il est essentiellement associé au degré d’unicité des valeurs d’une colonne selon l’article de Wikipédia lié à Kami.

Pourquoi est-il important de considérer que cela affecte la stratégie d’indexation. Il y aura peu d’indexation d’une colonne de faible cardinalité avec seulement 2 valeurs possibles car l’index ne sera pas suffisamment sélectif pour être utilisé.

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

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

  • meilleure performance des requêtes de lecture;
  • taille de firebase database plus grande;
  • performances moins bonnes des requêtes d’écriture, car les données d’index masquées sont en cours de mise à jour.

De manière simple, la cardinalité est le nombre de lignes ou de tuples dans la table. Le nombre de colonnes est appelé “degré”

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 le jeu “A”.

Soit l’ensemble “A”: A = {1,2,3} – la cardinalité de cet ensemble est | 3 |.

Si set “A” contient 5 valeurs A = {10,21,33,42,57}, alors la cardinalité est | 5 |.

Ce que cela signifie dans le contexte de mysql, c’est que la cardinalité d’une colonne de table est le nombre de valeurs uniques de cette colonne. Si vous examinez la cardinalité de votre colonne de clé primaire (par exemple, table.id), la cardinalité de cette colonne vous indiquera combien de lignes cette table contient, car il existe un identifiant unique pour chaque ligne de la table. Vous n’avez pas besoin d’exécuter un “COUNT (*)” sur cette table pour savoir combien de lignes il a, regardez simplement la cardinalité.

A partir du manuel :

La 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 parsing 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)