mysql - 为什么我的 MySQL 复合索引的基数小于同一列上的单个索引?

标签 mysql sql indexing b-tree composite-index

我首先在表中创建了 2 个单独的索引:uid 和 time。然后我决定创建一个复合索引(uid,时间)。 但是为什么复合索引(第 3 行)中 uid 的基数小于单个索引(第 1 行)中 uid 的基数?

mysql> show index from full_data;
+-----------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table     | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| full_data |          1 | uid       |            1 | uid         | A         |    26394792 |     NULL | NULL   | YES  | BTREE      |         |               |
| full_data |          1 | time      |            1 | time        | A         |     6934463 |     NULL | NULL   | YES  | BTREE      |         |               |
| full_data |          1 | composite |            1 | uid         | A         |    23166632 |     NULL | NULL   | YES  | BTREE      |         |               |
| full_data |          1 | composite |            2 | time        | A         |    86380688 |     NULL | NULL   | YES  | BTREE      |         |               |
+-----------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.05 sec)

最佳答案

基数,在那种情况下,是基于对索引 BTree 的一些随机探测的粗略估计。 INDEX(uid) 执行一组随机探测; INDEX(uid, time) 探测不同的 BTree。

当您同时拥有 INDEX(uid)INDEX(uid, time) 时,几乎没有必要保留前者。它会使磁盘困惑,增加插入/更新/删除时间,并且不会显着加快 SELECT 的速度。有时它甚至会减慢 SELECT 的速度。

ANALYZE TABLE 将重新探测以刷新基数统计信息。这些值可能会发生变化,但准确性可能会提高也可能不会提高。

关于mysql - 为什么我的 MySQL 复合索引的基数小于同一列上的单个索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55622157/

相关文章:

java - 覆盖索引无法优化mysql8.0中的limit查询

php - 使用搜索词 PHP 从 MySQL 中绘图。我不知道出了什么问题

sql - 如何将新概念引入0..1实例的数据库表结构?

sql - 参数化 SQL IN 子句

sql - 将数据附加到拆分行

sql - 为什么此查询不使用索引?

database - Neo4j:逐步创建自动索引

php - 从 SQL 数据库表定义各种变量 - 更好的做法?

mysql - 设置 session 变量时 MariaDB 类型错误

php - 按数据库中的选定列排序