1

我首先在我的表中创建了 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)
4

1 回答 1

0

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

当你同时拥有INDEX(uid)INDEX(uid, time)时,几乎没有必要保留前者。它使磁盘混乱,增加了插入/更新/删除时间,并且没有明显加快SELECT. 它有时甚至会变慢SELECT

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

于 2019-04-22T22:38:11.900 回答