Co to jest liczność w MySQL?

106

Co to jest liczność w MySQL? Proszę wyjaśnić prostym, nietechnicznym językiem.

Jeśli szczegół indeksu dowolnej tabeli wyświetla liczność pola, na przykład group_id11, to co to oznacza?

OM The Eternity
źródło

Odpowiedzi:

120

Maksymalna liczność: wszystkie wartości są unikalne

Min. Liczność: wszystkie wartości są takie same

Niektóre kolumny nazywane są kolumnami o dużej mocy zbioru, ponieważ mają na miejscu ograniczenia (np. Unikatowe), które zabraniają umieszczania tej samej wartości w każdym wierszu.

Kardynalność to właściwość, która wpływa na możliwość grupowania, sortowania i wyszukiwania danych. Dlatego jest to ważna miara dla planistów zapytań w bazach danych, jest to heurystyka, której mogą użyć do wybrania najlepszych planów.

Alexander Torstling
źródło
10
O co chodzi z tym fetyszem wielkich słów. „Odrębność” działałaby dobrze, prawda?
Pacerier
8
@Pacerier: Tak, chociaż wydaje mi się, że ludzie pracujący nad bazami danych są już dość obeznani z teorią relacji, teorią mnogości i matematyką. I zapożyczyli termin z teorii mnogości: en.m.wikipedia.org/wiki/Cardinality
Alexander Torstling.
27
@Pacerier, Distinctness to większe słowo (o 1)
Drew
4
@Drew,;) nie przy porównywaniu leksemów.
Pacerier,
8
@Pacerier Lexeme? „Odrębność” też by tam działała, prawda? ;) Jeśli pracujemy wystarczająco ciężko, możemy zredukować cały język do zaledwie jednego słowa i wyrazić siebie poprzez różne powtórzenia i przerwy.
Jason
34

Wikipedia podsumowuje liczność w SQL w następujący sposób:

W języku SQL (Structured Query Language) termin kardynalność odnosi się do niepowtarzalności wartości danych zawartych w określonej kolumnie (atrybucie) tabeli bazy danych . Im mniejsza liczność, tym więcej zduplikowanych elementów w kolumnie. W ten sposób kolumna o najniższej możliwej liczności miałaby taką samą wartość dla każdego wiersza. Bazy danych SQL używają liczności, aby pomóc określić optymalny plan zapytań dla danego zapytania.

Kami
źródło
25

Jest to oszacowanie liczby unikalnych wartości w indeksie.

W przypadku tabeli z jedną kolumną klucza podstawowego liczność powinna normalnie być równa liczbie wierszy w tabeli.

Więcej informacji .

Rapsodia
źródło
15

Zasadniczo jest to związane ze stopniem niepowtarzalności wartości kolumny zgodnie z artykułem w Wikipedii, do którego prowadzi Kami.

Warto wziąć pod uwagę fakt, że ma to wpływ na strategię indeksowania. Będzie niewiele punktów indeksowania kolumny o niskiej liczności zawierającej tylko 2 możliwe wartości, ponieważ indeks nie będzie wystarczająco selektywny, aby można go było użyć.

Martin Smith
źródło
4
Drugi akapit jest ważny, jeśli próbujesz zrozumieć, kiedy indeksowanie kolumny ma sens.
VMC
10

Im większa liczność, tym lepsze różnicowanie rzędów. Zróżnicowanie pomaga nawigować po mniejszych gałęziach w celu uzyskania danych.

Dlatego wyższe wartości kordinalności oznaczają:

  • lepsza wydajność zapytań do odczytu;
  • większy rozmiar bazy danych;
  • gorsza wydajność zapytań zapisu, ponieważ aktualizowane są ukryte dane indeksu.
Zon
źródło
7

W kategoriach matematycznych liczność to liczba wartości w zbiorze wartości. Zestaw może zawierać tylko unikalne wartości. Przykładem może być zbiór „A”.

Niech zbiór „A” będzie: A = {1, 2, 3} - liczność tego zbioru wynosi | 3 |.

Jeśli zestaw „A” zawiera 5 wartości A = {10,21,33,42,57}, to liczność wynosi | 5 |.

W kontekście mysql oznacza to, że liczność kolumny tabeli to liczba unikalnych wartości tej kolumny. Jeśli patrzysz na liczność kolumny klucza podstawowego (np. Table.id), to liczność tej kolumny powie ci, ile wierszy zawiera ta tabela, ponieważ każdy wiersz w tabeli ma jeden unikalny identyfikator. Nie musisz wykonywać "COUNT (*)" na tej tabeli, aby dowiedzieć się, ile ma wierszy, po prostu spójrz na liczność.

user3112246
źródło
4

Mówiąc prosto, liczność to liczba wierszy lub krotek w tabeli. Liczba kolumn jest nazywana „stopniem”

Aayush
źródło
4

Z instrukcji :

Kardynalność

Szacunkowa liczba unikatowych wartości w indeksie. Jest to aktualizowane przez uruchomienie ANALYZE TABLE lub myisamchk -a. Kardynalność jest liczona na podstawie statystyk przechowywanych jako liczby całkowite, więc wartość niekoniecznie jest dokładna nawet w przypadku małych tabel. Im wyższa liczność, tym większa szansa, że ​​MySQL użyje indeksu podczas łączenia.

I analiza firmy 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
źródło
1
Ta odpowiedź nie zawiera żadnej treści, którą sam napisałeś, jest to po prostu kolaż z podręcznika MySQL i posta na blogu, do którego masz łącze. A do tego okropnie sformatowany.
Siguza,
1
Teraz wyraźnie wskazuje źródła i jest lepiej sformatowany.
Carla