Was ist Kardinalität in MySQL?

106

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_idBezeichnung 11 anzeigt , was bedeutet das dann?

OM Die Ewigkeit
quelle

Antworten:

120

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.

Alexander Torstling
quelle
10
Was ist mit diesem Fetisch für große Worte. "Unterscheidbarkeit" würde gut funktionieren, nicht wahr?
Pacerier
8
@Pacerier: Ja, obwohl ich denke, dass Leute, die an Datenbanken arbeiten, bereits mit relationaler Theorie, Mengenlehre und Mathematik vertraut sind. Und sie liehen sich den Begriff aus der Mengenlehre aus: en.m.wikipedia.org/wiki/Cardinality
Alexander Torstling
27
@ Pacerier, Unterscheidbarkeit ist ein größeres Wort (um 1)
Drew
4
@Drew ,;) nicht beim Vergleich von Lexemen.
Pacerier
8
@ Pacerier Lexeme? "Distinctness" würde auch dort funktionieren, nicht wahr? ;) Wenn wir hart genug arbeiten, können wir die gesamte Sprache auf nur ein Wort reduzieren und uns durch unterschiedliche Wiederholungen und Pausen ausdrücken.
Jason
34

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.

Kami
quelle
25

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.

Weitere Informationen .

Rhapsodie
quelle
15

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.

Martin Smith
quelle
4
Der zweite Absatz ist wichtig, wenn Sie verstehen möchten, wann es sinnvoll ist, eine Spalte zu indizieren.
VMC
10

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:

  • bessere Leistung von Leseabfragen;
  • größere Datenbankgröße;
  • Schlechtere Leistung von Schreibabfragen, da versteckte Indexdaten aktualisiert werden.
Zon
quelle
7

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.

user3112246
quelle
4

Kardinalität ist auf einfache Weise die Anzahl der Zeilen oder Tupel in der Tabelle. Die Anzahl der Spalten wird als "Grad" bezeichnet.

Aayush
quelle
4

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)
Junjie Li
quelle
1
Diese Antwort enthält keinen Inhalt, den Sie selbst geschrieben haben. Es handelt sich lediglich um eine Collage aus dem MySQL-Handbuch und dem Blog-Beitrag, auf den Sie verlinkt haben. Und obendrein schrecklich formatiert.
Siguza
1
Jetzt sind die Quellen klar angegeben und besser formatiert.
Carla