Что такое количество элементов в MySQL? Пожалуйста, объясните простым, нетехническим языком.
Если элемент указателя любой таблицы отображает количество элементов поля, скажем, group_id
11, что это означает?
Что такое количество элементов в MySQL? Пожалуйста, объясните простым, нетехническим языком.
Если элемент указателя любой таблицы отображает количество элементов поля, скажем, group_id
11, что это означает?
Ответы:
Максимальное количество элементов: все значения уникальны
Минимальная мощность: все значения одинаковы
Некоторые столбцы называются столбцами с высокой мощностью, потому что они имеют ограничения (например, уникальность), запрещающие вам помещать одно и то же значение в каждую строку.
Количество элементов - это свойство, которое влияет на возможность кластеризации, сортировки и поиска данных. Поэтому это важное измерение для планировщиков запросов в БД, это эвристика, которую они могут использовать для выбора лучших планов.
Википедия резюмирует количество элементов в SQL следующим образом:
В SQL (язык структурированных запросов), термин мощность относится к уникальности значений данных , содержащейся в определенном столбце (атрибуты) в виде базы данных таблицы . Чем меньше мощность, тем больше повторяющихся элементов в столбце. Таким образом, столбец с наименьшей возможной мощностью будет иметь одинаковое значение для каждой строки. В базах данных SQL количество элементов используется для определения оптимального плана запроса для данного запроса.
Это оценка количества уникальных значений в индексе.
Для таблицы с одним столбцом первичного ключа количество элементов обычно должно быть равно количеству строк в таблице.
Это в основном связано со степенью уникальности значений столбца согласно статье в Википедии, на которую ссылается Ками.
Важно учитывать то, что это влияет на стратегию индексации. При индексации столбца с низкой мощностью всего с двумя возможными значениями будет мало очков, поскольку индекс не будет достаточно избирательным для использования.
Чем выше мощность, тем лучше дифференциация строк. Дифференциация помогает перемещаться по меньшему количеству ветвей для получения данных.
Следовательно, более высокие значения сердечности означают:
С математической точки зрения мощность - это количество значений в наборе значений. Набор может содержать только уникальные значения. Примером может служить набор «А».
Пусть набор "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)