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

时间:2019-04-10 22:29:06

标签: 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)

1 个答案:

答案 0 :(得分:0)

基数,在这种情况下 是基于对索引BTree的一些随机探测得出的粗略估计。 INDEX(uid)执行一组随机探测; INDEX(uid, time)探查了另一个BTree。

当您同时拥有INDEX(uid)INDEX(uid, time)时,实际上无需保留前者。它会使磁盘混乱,增加插入/更新/删除时间,并且不会明显加快SELECT的速度。有时甚至会降低SELECT的速度。

ANALYZE TABLE将重新进行探测以刷新基数统计信息。值可能会更改,但准确性可能会提高,也可能不会提高。