Що таке кардинальність у MySQL? Будь ласка, поясніть простою, нетехнічною мовою.
Якщо детальна інформація про індекс будь-якої таблиці відображає кардинальність поля, наприклад, group_id
як 11, то що це означає?
Що таке кардинальність у MySQL? Будь ласка, поясніть простою, нетехнічною мовою.
Якщо детальна інформація про індекс будь-якої таблиці відображає кардинальність поля, наприклад, group_id
як 11, то що це означає?
Відповіді:
Макс. Кардинальність: усі значення унікальні
Мінімальна кардинальність: усі значення однакові
Деякі стовпці називаються стовпцями високої кардинальності, оскільки вони мають обмежені місця (як унікальні), що забороняють вводити однакове значення у кожен рядок.
Кардіальність - властивість, яка впливає на можливість кластеризації, сортування та пошуку даних. Тому це важливий показник для планувальників запитів у БД, це евристика, яку вони можуть використовувати для вибору найкращих планів.
Вікіпедія підсумовує кардинальність у SQL так:
У SQL (Structured Query Language) термін кардинальність відноситься до унікальності значень даних, що містяться в певному стовпчику (атрибуті) таблиці бази даних . Чим нижча кардинальність, тим більше дублюються елементи в стовпці. Таким чином, стовпець з найменшою можливою кардинальністю матиме однакове значення для кожного ряду. Бази даних SQL використовують кардинальність, щоб допомогти визначити оптимальний план запитів для заданого запиту.
Це оцінка кількості унікальних значень в індексі.
Для таблиці з одним стовпцем первинного ключа, простота зазвичай повинна дорівнювати кількості рядків у таблиці.
Це, в основному, пов'язане зі ступенем унікальності значень стовпця відповідно до статті Вікіпедії, пов’язаної з Камі.
Чому важливо враховувати, що це впливає на стратегію індексації. Буде мало точкової індексації стовпця з низькою кардинальністю лише з 2 можливими значеннями, оскільки індекс буде недостатньо вибірковим для використання.
Чим вища кардинальність, тим краще диференціювання рядків. Диференціація допомагає навігації менше гілок для отримання даних.
Тому більш високі значення кордіональності означають:
У математичному плані кардинальність - це кількість значень у наборі значень. Набір може містити лише унікальні значення. Прикладом може бути множина "A".
Нехай множина "A" буде: A = {1,2,3} - кардинальність цього набору дорівнює | 3 |.
Якщо множина "A" містить 5 значень A = {10,21,33,42,57}, то кардинальність дорівнює | 5 |.
Що означає це в контексті mysql, це те, що простота таблиці стовпця - це кількість унікальних значень цього стовпця. Якщо ви дивитеся на простоту вашого стовпця первинного ключа (наприклад, table.id), то кардинальність цього стовпця підкаже вам, скільки рядків містить ця таблиця, оскільки в кожному рядку таблиці є один унікальний ідентифікатор. Не потрібно виконувати "COUNT (*)" на цій таблиці, щоб дізнатися, скільки рядків у неї є, просто подивіться на простоту.
З посібника :
Кардинальність
Оцінка кількості унікальних значень в індексі. Це оновлено, запустивши ANALYZE TABLE або myisamchk -a. Кардинальність обчислюється на основі статистичних даних, що зберігаються у вигляді цілих чисел, тому значення не обов'язково є точним навіть для невеликих таблиць. Чим вище кардинальність, тим більше шансів, що MySQL використовує індекс під час приєднання.
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)