什么是MySQL的基数?
什么是MySQL的基数? 请用简单的非技术性的语言来解释。
如果任何表的索引细节显示字段的基数,说group_id
为11,那么这是什么意思?
最大基数:所有值都是唯一的
最小基数:所有值都是一样的
有些列被称为高基数列,因为它们具有限制(如独特),禁止您在每一行中放入相同的值。
基数是影响对数据进行聚类,分类和search的能力的属性。 因此,它是数据库中查询规划人员的重要衡量标准,它是一种启发式的方法,可以用来select最佳的计划。
维基百科在SQL中总结了基数,如下所示:
在SQL (结构化查询语言)中,术语基数是指包含在数据库 表的特定列(属性)中的数据值的唯一性 。 基数越低,列中的重复元素越多。 因此,具有最低基数的列对于每一行都具有相同的值。 SQL数据库使用基数来帮助确定给定查询的最佳查询计划 。
它是索引中唯一值的估计值。
对于具有单个主键列的表,基数通常应等于表中的行数。
更多信息 。
它基本上与按照Kami链接的维基百科文章的列值的唯一性程度相关联。
为什么重要的是要考虑它影响索引策略。 只有2个可能值的索引低基数列,因为索引将不具有足够的select性使用。
行列越高越好。 差异化有助于导航较less的分支来获取数据。
因此,更高的cordinality值意味着:
- 更好的读取查询性能;
- 更大的数据库大小
- 写查询性能较差,因为隐藏索引数据正在更新。
以一种简单的方式,基数是表内的行数或元组数。 列数被称为“度”
在math术语中,基数是一组数值中的数值。 一个集合只能包含唯一的值。 一个例子是设置“A”。
设“A”为:A = {1,2,3} – 该集合的基数为| 3 |。
如果设置“A”包含5个值A = {10,21,33,42,57},那么基数是| 5 |。
这意味着在mysql的上下文中,表列的基数是该列的唯一值的计数。 如果您正在查看主键列(例如table.id)的基数,那么该列的基数将告诉您该表包含多less行,因为表中的每一行都有一个唯一的ID。 您不必在该表上执行“COUNT(*)”来查找它有多less行,只需查看基数即可。
从手册 :
基数
估计索引中唯一值的数量。 这通过运行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)