MySQL 中的 key_len 为什么会大于索引列的长度?
MySQL:关于 key_len 计算方式的解析
问题描述:
在 MySQL 8.0.18 中,创建了一个表 student,其中包含一个 char(20) 的列 student_name,并建立了索引 student_name_index。向表中插入了三条数据。
通过使用 EXPLAIN 查看执行计划,发现最终使用的索引的 key_len 为 80。然而,表中只有三条记录,key_len 应该为20 * 3 = 60,为何出现这种情况?
答案解析:
char(20) 定义了一个定长字符类型,可以存储长度不超过 20 个字节的字符串。而 utf8mb4 是一种编码方式,它允许使用不同的字节数来表示不同的字符。对于 utf8mb4 编码,一个字符最多可以占 4 个字节。
因此,对于 student_name 列,其长度为 20 个字符,但由于使用的是 utf8mb4 编码,每个字符实际占用 4 个字节,所以 key_len 实际上为 20 * 4 = 80。
与表中记录的数量无关,key_len 始终是索引列实际占用的字节数。