Що таке кардинальність у MySQL?


106

Що таке кардинальність у MySQL? Будь ласка, поясніть простою, нетехнічною мовою.

Якщо детальна інформація про індекс будь-якої таблиці відображає кардинальність поля, наприклад, group_idяк 11, то що це означає?

Відповіді:


120

Макс. Кардинальність: усі значення унікальні

Мінімальна кардинальність: усі значення однакові

Деякі стовпці називаються стовпцями високої кардинальності, оскільки вони мають обмежені місця (як унікальні), що забороняють вводити однакове значення у кожен рядок.

Кардіальність - властивість, яка впливає на можливість кластеризації, сортування та пошуку даних. Тому це важливий показник для планувальників запитів у БД, це евристика, яку вони можуть використовувати для вибору найкращих планів.


10
Що з цим фетишем для великих слів. "Відмінність" спрацювала б нормально, чи не так?
Pacerier

8
@Pacerier: Так, хоча я думаю, що люди, що працюють над базами даних, вже досить добре знайомі з реляційною теорією, теорією множин та математикою. І вони запозичили термін із теорії множин: en.m.wikipedia.org/wiki/Cardinality
Олександр Торстлінг

27
@Pacerier, Відмінність - це більше слово (на 1)
Дрю

4
@Drew,;) немає, якщо порівнювати лексеми.
Pacerier

8
@Pacerier Lexeme? "Відмінність" також працювала б там, чи не так? ;) Якщо ми працюємо досить наполегливо, ми можемо скоротити всю мову до всього лише 1 слова і висловити себе через різні повторення та паузи.
Джейсон

34

Вікіпедія підсумовує кардинальність у SQL так:

У SQL (Structured Query Language) термін кардинальність відноситься до унікальності значень даних, що містяться в певному стовпчику (атрибуті) таблиці бази даних . Чим нижча кардинальність, тим більше дублюються елементи в стовпці. Таким чином, стовпець з найменшою можливою кардинальністю матиме однакове значення для кожного ряду. Бази даних SQL використовують кардинальність, щоб допомогти визначити оптимальний план запитів для заданого запиту.


25

Це оцінка кількості унікальних значень в індексі.

Для таблиці з одним стовпцем первинного ключа, простота зазвичай повинна дорівнювати кількості рядків у таблиці.

Більше інформації .


15

Це, в основному, пов'язане зі ступенем унікальності значень стовпця відповідно до статті Вікіпедії, пов’язаної з Камі.

Чому важливо враховувати, що це впливає на стратегію індексації. Буде мало точкової індексації стовпця з низькою кардинальністю лише з 2 можливими значеннями, оскільки індекс буде недостатньо вибірковим для використання.


4
Другий абзац важливий, якщо ви намагаєтесь зрозуміти, коли є сенс індексувати стовпчик.
VMC

10

Чим вища кардинальність, тим краще диференціювання рядків. Диференціація допомагає навігації менше гілок для отримання даних.

Тому більш високі значення кордіональності означають:

  • краща ефективність читання-запитів;
  • більший розмір бази даних;
  • гірша ефективність запитів запису, оскільки приховані дані індексу оновлюються.

7

У математичному плані кардинальність - це кількість значень у наборі значень. Набір може містити лише унікальні значення. Прикладом може бути множина "A".

Нехай множина "A" буде: A = {1,2,3} - кардинальність цього набору дорівнює | 3 |.

Якщо множина "A" містить 5 значень A = {10,21,33,42,57}, то кардинальність дорівнює | 5 |.

Що означає це в контексті mysql, це те, що простота таблиці стовпця - це кількість унікальних значень цього стовпця. Якщо ви дивитеся на простоту вашого стовпця первинного ключа (наприклад, table.id), то кардинальність цього стовпця підкаже вам, скільки рядків містить ця таблиця, оскільки в кожному рядку таблиці є один унікальний ідентифікатор. Не потрібно виконувати "COUNT (*)" на цій таблиці, щоб дізнатися, скільки рядків у неї є, просто подивіться на простоту.


4

Простим способом, простота - це кількість рядків або кортежів всередині таблиці. Кількість стовпців називається "ступінь"


4

З посібника :

Кардинальність

Оцінка кількості унікальних значень в індексі. Це оновлено, запустивши ANALYZE TABLE або myisamchk -a. Кардинальність обчислюється на основі статистичних даних, що зберігаються у вигляді цілих чисел, тому значення не обов'язково є точним навіть для невеликих таблиць. Чим вище кардинальність, тим більше шансів, що MySQL використовує індекс під час приєднання.

І аналіз від 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)

1
Ця відповідь містить нульовий вміст, який ви самі написали, це лише колаж із посібника MySQL та повідомлення в блозі, з яким ви пов’язані. І жахливо відформатований поверх цього.
Сігуза

1
Тепер він чітко говорить про джерела, і він краще відформатований.
carla
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.