Что такое мощность в MySQL? - PullRequest
99 голосов
/ 02 апреля 2010

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

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

Ответы [ 8 ]

115 голосов
/ 02 апреля 2010

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

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

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

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

32 голосов
/ 02 апреля 2010

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

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

24 голосов
/ 02 апреля 2010

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

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

Дополнительная информация .

14 голосов
/ 02 апреля 2010

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

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

9 голосов
/ 11 ноября 2013

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

Поэтому более высокие значения сердечности означают:

  • лучшая производительность запросов на чтение;
  • больший размер базы данных;
  • худшая производительность запросов записи, потому что данные скрытого индекса обновляются.
6 голосов
/ 05 октября 2015

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

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

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

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

4 голосов
/ 15 февраля 2017

Из руководства :

Cardinality

Оценка количества уникальных значений в индексе. Это обновляется с помощью команды 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)
4 голосов
/ 21 марта 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...