You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:45:08