Was ist Kardinalität in MySQL? Bitte erklären Sie in einfacher, nicht technischer Sprache.
Wenn ein Indexdetail einer Tabelle die Kardinalität eines Feldes mit der group_id
Bezeichnung 11 anzeigt , was bedeutet das dann?
Was ist Kardinalität in MySQL? Bitte erklären Sie in einfacher, nicht technischer Sprache.
Wenn ein Indexdetail einer Tabelle die Kardinalität eines Feldes mit der group_id
Bezeichnung 11 anzeigt , was bedeutet das dann?
Antworten:
Maximale Kardinalität: Alle Werte sind eindeutig
Min. Kardinalität: Alle Werte sind gleich
Einige Spalten werden als Spalten mit hoher Kardinalität bezeichnet, da sie Einschränkungen aufweisen (wie z. B. eindeutig), die verhindern, dass Sie in jede Zeile denselben Wert einfügen.
Kardinalität ist eine Eigenschaft, die sich auf die Fähigkeit auswirkt, Daten zu gruppieren, zu sortieren und zu suchen. Es ist daher eine wichtige Messung für die Abfrageplaner in DBs. Es ist eine Heuristik, mit der sie die besten Pläne auswählen können.
Wikipedia fasst die Kardinalität in SQL wie folgt zusammen:
In SQL (Structured Query Language), der Begriff Kardinalität bezieht sich auf die Einzigartigkeit von Datenwerten in einer bestimmten Spalte enthalten ist (Attribut) eine Datenbanktabelle . Je niedriger die Kardinalität, desto mehr doppelte Elemente in einer Spalte. Somit hätte eine Spalte mit der niedrigstmöglichen Kardinalität für jede Zeile den gleichen Wert. SQL-Datenbanken verwenden die Kardinalität, um den optimalen Abfrageplan für eine bestimmte Abfrage zu ermitteln.
Es ist eine Schätzung der Anzahl eindeutiger Werte im Index.
Bei einer Tabelle mit einer einzelnen Primärschlüsselspalte sollte die Kardinalität normalerweise der Anzahl der Zeilen in der Tabelle entsprechen.
Dies hängt im Wesentlichen mit dem Grad der Eindeutigkeit der Werte einer Spalte gemäß dem von Kami verlinkten Wikipedia-Artikel zusammen.
Es ist wichtig zu berücksichtigen, dass dies Auswirkungen auf die Indexierungsstrategie hat. Es wird wenig Sinn machen, eine Spalte mit niedriger Kardinalität mit nur 2 möglichen Werten zu indizieren, da der Index nicht selektiv genug ist, um verwendet zu werden.
Je höher die Kardinalität, desto besser ist die Differenzierung der Zeilen. Durch die Differenzierung können weniger Zweige navigiert werden, um Daten abzurufen.
Höhere Cordinalitätswerte bedeuten daher:
In mathematischen Begriffen ist Kardinalität die Anzahl der Werte in einer Reihe von Werten. Ein Satz kann nur eindeutige Werte enthalten. Ein Beispiel wäre die Menge "A".
Die Menge "A" sei: A = {1,2,3} - die Kardinalität dieser Menge ist | 3 |.
Wenn die Menge "A" 5 Werte A = {10,21,33,42,57} enthält, ist die Kardinalität | 5 |.
Im Kontext von MySQL bedeutet dies, dass die Kardinalität einer Tabellenspalte die Anzahl der eindeutigen Werte dieser Spalte ist. Wenn Sie sich die Kardinalität Ihrer Primärschlüsselspalte (z. B. table.id) ansehen, gibt die Kardinalität dieser Spalte an, wie viele Zeilen diese Tabelle enthält, da für jede Zeile in der Tabelle eine eindeutige ID vorhanden ist. Sie müssen für diese Tabelle kein "COUNT (*)" ausführen, um herauszufinden, wie viele Zeilen sie enthält. Schauen Sie sich einfach die Kardinalität an.
Aus dem Handbuch :
Kardinalität
Eine Schätzung der Anzahl eindeutiger Werte im Index. Dies wird durch Ausführen von ANALYZE TABLE oder myisamchk -a aktualisiert. Die Kardinalität wird basierend auf Statistiken gezählt, die als Ganzzahlen gespeichert sind, sodass der Wert selbst für kleine Tabellen nicht unbedingt genau ist. Je höher die Kardinalität, desto größer ist die Wahrscheinlichkeit, dass MySQL den Index bei Joins verwendet.
Und eine Analyse von 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)