如何通过MySQL EXPLAIN语句的key_len字段判断SQL执行效率高低
MySQL EXPLAIN 中 key_len 的工作原理与性能判断方法
首先明确 key_len 的基础定义:
key_len列表示MySQL决定使用的索引长度。
key_len的计算逻辑
key_len的数值严格按照索引字段的定义计算,核心规则如下:
- 定长字段:int占4字节、bigint占8字节、date占3字节,char(n)按字符集计算,utf8mb4编码下单字符占4字节,总长度为
n*4 - 变长字段:varchar(n)在定长计算基础上多2字节存储长度信息,总长度为
n*4 + 2 - 额外开销:如果字段允许为NULL,会额外加1字节存储NULL标记
key_len和SQL执行速度的关系
不是所有场景下key_len越小执行速度越快,要结合索引结构和查询逻辑判断:
- 符合性能正相关的场景:同一个索引的使用场景下,key_len越小性能越好。比如你有联合索引
(a,b,c),查询仅用到a列时的key_len远小于用到全部三列的情况,此时单个索引项占用空间更小,内存/磁盘IO的读取效率更高,同等扫描行数下速度更快。 - 不符合性能正相关的场景:如果key_len更小是因为索引未充分使用,反而会导致性能下降。比如同样是联合索引
(uid, create_time),查询select * from order where uid = 123 and create_time > '2024-01-01',如果key_len仅为uid字段的4字节,说明create_time的过滤条件没有用到索引,需要对uid匹配到的所有行做二次过滤,性能远不如key_len为4+3=7字节(同时用到uid和create_time)的情况。
实际优化中的判断技巧
- 可以用key_len判断联合索引的使用率:如果索引总长度远大于key_len,需要检查查询条件是否漏用了后续的索引列,是否存在优化空间
- 合理缩小key_len可以提升性能:比如字符串字段前缀区分度足够时,可以创建前缀索引
key idx_name(name(10)),此时key_len远小于全字段索引,索引体积更小,查询速度更快,但如果前缀区分度过低,反而会导致扫描行数增加,性能下降。
内容的提问来源于stack exchange,提问作者zihao Q
相关产品推荐
相关产品推荐

