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_id
come 11, cosa significa?
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_id
come 11, cosa significa?
Risposte:
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.
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.
È 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.
È 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.
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:
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à.
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.
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)