MySQL中的基数是什么?


106

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

如果任何表的索引详细信息显示字段的基数group_id为11,那意味着什么?

Answers:


120

最大基数:所有值都是唯一的

最小基数:所有值都相同

有些列称为高基数列,因为它们具有适当的约束(例如唯一性),禁止您在每行中输入相同的值。

基数是影响聚类,排序和搜索数据能力的属性。因此,对于数据库中的查询计划者而言,这是一项重要的衡量标准,这是一种启发式方法,他们可以用来选择最佳计划。


10
大话的恋物癖是什么。“区别”会很好,不是吗?
Pacerier

8
@Pacerier:是的,尽管我认为从事数据库工作的人们已经非常熟悉关系理论,集合论和数学。他们从集合论中借用了该术语:en.m.wikipedia.org/wiki/Cardinality
Alexander Torstling 2015年

27
@ Pacerier,Distinctness是一个更大的词(按1)
Drew

4
@Drew,;)如果比较词素则不是。
Pacerier's

8
@Pacerier Lexeme?“独特性”也可以在这里使用,不是吗?;)如果我们努力工作,我们可以将整个语言减少到只有1个字,并通过不同的重复和停顿来表达自己。
杰森

34

维基百科总结了SQL的基数如下:

SQL(结构化查询语言)中,术语基数是指数据库的特定列(属性)中包含的数据值的唯一性。基数越低,列中的元素重复越多。因此,具有最低可能基数的列将对每行具有相同的值。SQL数据库使用基数来帮助确定给定查询的最佳查询计划


25

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

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

更多信息


15

根据Kami链接到的Wikipedia文章,它基本上与列值的唯一性程度相关。

重要的考虑因素是它会影响索引策略。只有很少的索引可以索引只有2个可能的低基数列,因为索引的选择性不够高,无法使用。


4
如果您尝试理解何时索引列,第二段很重要。
VMC

10

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

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

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

7

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

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

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

在mysql的上下文中,这意味着表列的基数是该列唯一值的计数。如果您正在查看主键列的基数(例如table.id),那么该列的基数将告诉您该表包含多少行,因为该表中的每一行都有一个唯一的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手册和您链接到的博客文章的拼贴。并在此之上进行了可怕的格式化。
Siguza

1
现在,它清楚地说明了来源,并且格式也更好。
卡拉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.