MySQL EXPLAIN 结果中,key_len 是一个很重要但常被误解的字段。
本文我们来详细解释一下它的含义、计算方式,以及是否“越大越好”。


🧩 一、key_len 是什么

key_len 表示 MySQL 实际使用的索引字节长度(单位:字节),也就是优化器在查询中使用了索引的 多少部分

  • 它告诉你 用了索引的前多少个列(如果是联合索引的话),以及每个列用了多少字节。
  • 它并不是索引本身的总长度,而是查询中“用到的索引前缀长度”。

🧮 二、计算方式(举例)

假设有一个复合索引:

CREATE INDEX idx_user ON users (country_code CHAR(2), age INT, name VARCHAR(50));

不同的查询会导致 key_len 不同:

查询语句

使用的索引列

key_len(大约)

WHERE country_code='US'

country_code

2(+1 字节字符集)= 3

WHERE country_code='US' AND age=25

country_code + age

3 + 4 = 7

WHERE country_code='US' AND age=25 AND name='Tom'

全部三列

3 + 4 + 50 + 2(变长字段额外长度)≈ 59

注意:VARCHAR 类型字段还会额外占用 1~2 字节存储长度信息。


⚖️ 三、key_len 越大越好吗?

不一定!

  • 更大的 key_len 意味着使用了更多的索引列,在某些情况下可以让过滤更精准(减少扫描的行数)。
  • ❌ 但如果查询条件只需要用到前几列,强行使用更多列反而没有额外收益,甚至可能导致索引失效或浪费存储。

举个例子:

EXPLAIN SELECT * FROM users WHERE country_code='US';

这里只过滤国家,key_len=3 就够了。
没必要非得用到 agename

所以,“越大越好”这个说法是错误的。
正确理解是:

✅ key_len 越准确地反映你查询中有效使用的索引列越好。
⚠️ 不在于大,而在于“匹配合理”。


🧠 四、实战分析建议

  1. 看 key_len 能判断联合索引使用到第几列
  • 可以用来分析“索引下推”或“索引失效”的情况。
  1. 与 key、ref 配合看
  • key 显示使用了哪个索引;
  • key_len 显示用了多少;
  • ref 显示哪些列或常量与索引进行了比较。
  1. 如果 key_len 小于你期望的
  • 可能是因为某列在查询条件中用在了范围查询(>, <, LIKE 'abc%' 等),导致后续列无法使用索引。

✅ 总结

项目

含义

字段名

key_len

单位

字节

表示内容

实际使用的索引长度

是否越大越好?

❌ 不是越大越好,取决于查询使用了哪些索引列

用途

判断优化器使用了联合索引的哪些部分