Что такое количество элементов в MySQL?

106

Что такое количество элементов в MySQL? Пожалуйста, объясните простым, нетехническим языком.

Если элемент указателя любой таблицы отображает количество элементов поля, скажем, group_id11, что это означает?

ОМ Вечность
источник

Ответы:

120

Максимальное количество элементов: все значения уникальны

Минимальная мощность: все значения одинаковы

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

Количество элементов - это свойство, которое влияет на возможность кластеризации, сортировки и поиска данных. Поэтому это важное измерение для планировщиков запросов в БД, это эвристика, которую они могут использовать для выбора лучших планов.

Александр Торстлинг
источник
10
Что за фетиш на громкие слова. "Отчетливость" подойдет, не так ли?
Pacerier
8
@Pacerier: Да, хотя я думаю, что люди, работающие с базами данных, уже хорошо знакомы с теорией отношений, теорией множеств и математикой. И они позаимствовали термин из теории множеств: en.m.wikipedia.org/wiki/Cardinality
Александр Торстлинг
27
@Pacerier, Отчетливость - большее слово (на 1)
Дрю
4
@Drew,;) нет, если сравнивать лексемы.
Pacerier
8
@Pacerier Lexeme? "Отчетливость" там тоже подойдет, не так ли? ;) Если мы будем достаточно много работать, мы сможем сократить весь язык до одного слова и выразить себя с помощью различных повторений и пауз.
Джейсон
34

Википедия резюмирует количество элементов в SQL следующим образом:

В SQL (язык структурированных запросов), термин мощность относится к уникальности значений данных , содержащейся в определенном столбце (атрибуты) в виде базы данных таблицы . Чем меньше мощность, тем больше повторяющихся элементов в столбце. Таким образом, столбец с наименьшей возможной мощностью будет иметь одинаковое значение для каждой строки. В базах данных SQL количество элементов используется для определения оптимального плана запроса для данного запроса.

Ками
источник
25

Это оценка количества уникальных значений в индексе.

Для таблицы с одним столбцом первичного ключа количество элементов обычно должно быть равно количеству строк в таблице.

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

Рапсодия
источник
15

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

Важно учитывать то, что это влияет на стратегию индексации. При индексации столбца с низкой мощностью всего с двумя возможными значениями будет мало очков, поскольку индекс не будет достаточно избирательным для использования.

Мартин Смит
источник
4
Второй абзац важен, если вы пытаетесь понять, когда имеет смысл индексировать столбец.
VMC
10

Чем выше мощность, тем лучше дифференциация строк. Дифференциация помогает перемещаться по меньшему количеству ветвей для получения данных.

Следовательно, более высокие значения сердечности означают:

  • лучшая производительность read-запросов;
  • больший размер базы данных;
  • худшая производительность запросов на запись из-за обновления данных скрытого индекса.
Зон
источник
7

С математической точки зрения мощность - это количество значений в наборе значений. Набор может содержать только уникальные значения. Примером может служить набор «А».

Пусть набор "A" равен: A = {1,2,3} - мощность этого набора равна | 3 |.

Если набор «A» содержит 5 значений A = {10,21,33,42,57}, то мощность равна | 5 |.

В контексте mysql это означает, что мощность столбца таблицы - это количество уникальных значений этого столбца. Если вы смотрите на количество элементов вашего столбца первичного ключа (например, table.id), то количество элементов этого столбца покажет вам, сколько строк содержит эта таблица, поскольку для каждой строки в таблице существует один уникальный идентификатор. Вам не нужно выполнять «COUNT (*)» для этой таблицы, чтобы узнать, сколько в ней строк, просто посмотрите на количество элементов.

user3112246
источник
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
Теперь ясно написано исходники и лучше отформатировано.
Карлу