MySQL 中的基数是什么?

基数在 MySQL 中是什么? 请用简单的非技术语言解释。

If a index detail of any table displays the cardinality of a field say group_id as 11, then what does that mean?

89752 次浏览

Wikipedia summarizes SQL 中的基数 as follows:

SQL(SQL)中,术语 枢机主教是指包含在 database 桌子的特定列(属性)中的数据值的 独一无二。基数越低,列中重复的元素越多。因此,具有最低可能基数的列对于每一行具有相同的值。SQL 数据库使用基数来帮助确定给定查询的最佳 查询计划

它是对索引中唯一值的数目的估计。

对于具有单个主键列的表,基数通常应等于表中的行数。

更多资料

Max cardinality: All values are unique

最小基数: 所有值都相同

有些列被称为高基数列,因为它们有适当的约束(比如惟一性) ,禁止在每一行中放置相同的值。

Cardinality is a property which affects the ability to cluster, sort and search data. It is therefore an important measurement for the query planners in DBs, it is a heuristic which they can use to choose the best plans.

It's basically associated with the degree of uniqueness of a column's values as per the Wikipedia article linked to by Kami.

为什么重要的是要考虑它影响索引策略。对只有2个可能值的低基数列进行索引几乎没有意义,因为索引的选择性不足以使用。

简单来说,基数就是表中的行或元组的数量。没有。称为“度”

基数越高,行的差异性越好。差异性有助于导航较少的分支以获得数据。

因此,较高的相关性值意味着:

  • 更好的读查询性能;
  • 较大的数据库容量;
  • 写查询的性能更差,因为正在更新隐藏索引数据。

在数学术语中,基数是一组值中值的计数。一个集合只能包含唯一的值。 一个例子就是集合“ A”。

设集合“ A”为: A = {1,2,3}-该集合的基数为 | 3 | 。

如果集合“ A”包含5个值 A = {10,21,33,42,57} ,则基数为 | 5 | 。

SET     VALUES           Cardinality
A       1,2,3                 3
B       10,21,33,42,57        5

在 MySQL 上下文中,这意味着表列的基数是该列的唯一值的计数。如果查看主键列的基数(例如 table.ID) ,那么该列的基数将告诉您该表包含多少行,因为表中的每一行都有一个唯一的 ID。 您不必对该表执行“ COUNT (*)”来查找它有多少行,只需查看基数即可。

来自 手动操作:

红衣主教

索引中唯一值的估计数 通过运行 AnalyzeTABLE 或 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)