我首先在表中创建了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)
答案 0 :(得分:0)
基数,在这种情况下 是基于对索引BTree的一些随机探测得出的粗略估计。 INDEX(uid)
执行一组随机探测; INDEX(uid, time)
探查了另一个BTree。
当您同时拥有INDEX(uid)
和INDEX(uid, time)
时,实际上无需保留前者。它会使磁盘混乱,增加插入/更新/删除时间,并且不会明显加快SELECT
的速度。有时甚至会降低SELECT
的速度。
ANALYZE TABLE
将重新进行探测以刷新基数统计信息。值可能会更改,但准确性可能会提高,也可能不会提高。