Cos'è la cardinalità in MySQL?


106

Cos'è la cardinalità in MySQL? Si prega di spiegare in un linguaggio semplice e non tecnico.

Se un dettaglio dell'indice di una tabella mostra la cardinalità di un campo group_idcome 11, cosa significa?

Risposte:


120

Cardinalità massima: tutti i valori sono univoci

Cardinalità minima: tutti i valori sono gli stessi

Alcune colonne sono chiamate colonne ad alta cardinalità perché hanno vincoli (come unici) che impediscono di inserire lo stesso valore in ogni riga.

La cardinalità è una proprietà che influisce sulla capacità di raggruppare, ordinare e cercare i dati. È quindi una misura importante per i pianificatori di query nei DB, è un'euristica che possono utilizzare per scegliere i piani migliori.


10
Cos'è questo feticcio per le parole grandi. "Distinctness" funzionerebbe bene, non è vero?
Pacerier

8
@Pacerier: Sì, anche se penso che le persone che lavorano sui database abbiano già abbastanza familiarità con la teoria relazionale, la teoria degli insiemi e la matematica. E hanno preso in prestito il termine dalla teoria degli insiemi: en.m.wikipedia.org/wiki/Cardinality
Alexander Torstling

27
@Pacerier, Distinctness is a big word (by 1)
Drew

4
@Drew,;) non se si confrontano i lessemi.
Pacerier

8
@Pacerier Lexeme? "Distinctness" funzionerebbe anche lì, no? ;) Se lavoriamo abbastanza duramente, possiamo ridurre l'intera lingua a una sola parola ed esprimerci attraverso ripetizioni e pause variabili.
Jason

34

Wikipedia riassume la cardinalità in SQL come segue:

In SQL (Structured Query Language), il termine cardinalità si riferisce all'unicità dei valori dei dati contenuti in una particolare colonna (attributo) di una tabella di database . Più bassa è la cardinalità, più elementi duplicati in una colonna. Pertanto, una colonna con la cardinalità più bassa possibile avrebbe lo stesso valore per ogni riga. I database SQL utilizzano la cardinalità per determinare il piano di query ottimale per una determinata query.


25

È una stima del numero di valori univoci nell'indice.

Per una tabella con una singola colonna di chiave primaria, la cardinalità dovrebbe normalmente essere uguale al numero di righe nella tabella.

Maggiori informazioni .


15

È fondamentalmente associato al grado di unicità dei valori di una colonna come da articolo di Wikipedia collegato a Kami.

Perché è importante considerare che influisce sulla strategia di indicizzazione. Ci sarà un piccolo punto nell'indicizzare una colonna con cardinalità bassa con solo 2 valori possibili poiché l'indice non sarà abbastanza selettivo per essere utilizzato.


4
Il secondo paragrafo è importante se cerchi di capire quando ha senso indicizzare una colonna.
VMC

10

Maggiore è la cardinalità, migliore è la differenziazione delle righe. La differenziazione aiuta a navigare in meno rami per ottenere dati.

Pertanto valori di cordinalità più elevati significano:

  • migliori prestazioni delle query di lettura;
  • dimensione del database più grande;
  • prestazioni peggiori delle query di scrittura, perché i dati degli indici nascosti vengono aggiornati.

7

In termini matematici, la cardinalità è il conteggio dei valori in un insieme di valori. Un insieme può contenere solo valori univoci. Un esempio potrebbe essere l'insieme "A".

Sia l'insieme "A": A = {1,2,3} - la cardinalità di quell'insieme è | 3 |.

Se il set "A" contiene 5 valori A = {10,21,33,42,57}, la cardinalità è | 5 |.

Ciò che significa nel contesto di mysql è che la cardinalità di una colonna della tabella è il conteggio dei valori univoci di quella colonna. Se stai osservando la cardinalità della colonna della tua chiave primaria (es. Table.id), la cardinalità di quella colonna ti dirà quante righe contiene quella tabella, poiché c'è un ID univoco per ogni riga nella tabella. Non devi eseguire un "COUNT (*)" su quella tabella per scoprire quante righe ha, guarda semplicemente la cardinalità.


4

In un modo semplice, la cardinalità è il numero di righe o tuple all'interno della tabella. Il numero di colonne è chiamato "grado"


4

Dal manuale :

Cardinalità

Una stima del numero di valori univoci nell'indice. Questo viene aggiornato eseguendo ANALYZE TABLE o myisamchk -a. La cardinalità viene conteggiata in base alle statistiche archiviate come numeri interi, quindi il valore non è necessariamente esatto anche per le tabelle piccole. Maggiore è la cardinalità, maggiore è la possibilità che MySQL utilizzi l'indice durante i join.

E un'analisi di 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)

1
Questa risposta non contiene alcun contenuto che hai scritto tu stesso, è solo un collage dal manuale MySQL e dal post del blog a cui ti sei collegato. E orribilmente formattato per di più.
Siguza

1
Ora dice chiaramente le fonti ed è formattato meglio.
carla
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.