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_id
11, to co to oznacza?
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_id
11, to co to oznacza?
Odpowiedzi:
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.
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.
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.
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ć.
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ą:
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ść.
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.
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)