插件窝 干货文章 MySQL 中 key_len 的计算方法:为什么只有 3 条记录时 key_len 为 80?

MySQL 中 key_len 的计算方法:为什么只有 3 条记录时 key_len 为 80?

字节 使用 字符集 索引 930    来源:    2025-04-01

MySQL 中 key_len 的计算方法解析

key_len 的基本概念

key_len 在 MySQL 的 EXPLAIN 输出中表示 MySQL 在索引中使用的字节数。这个值可以帮助你了解查询实际使用了索引的哪些部分。

key_len 的计算方法

key_len 的计算基于以下几个因素:

  1. 列的数据类型:不同类型占用不同字节数

    • INT: 4 字节
    • BIGINT: 8 字节
    • DATE: 3 字节
    • DATETIME: 8 字节
    • VARCHAR(n): 如果使用 UTF8 字符集,最多 3n+2 字节
  2. 是否允许 NULL:如果列允许 NULL,需要额外 1 字节

  3. 字符集:不同字符集每个字符占用字节数不同

    • latin1: 1 字节/字符
    • utf8: 最多 3 字节/字符
    • utf8mb4: 最多 4 字节/字符
  4. 可变长度类型:如 VARCHAR 需要额外 2 字节存储长度信息

为什么只有 3 条记录时 key_len 为 80?

这种情况可能有以下几种原因:

  1. 复合索引:可能使用了包含多个列的复合索引,80 字节是这些列的总长度

    • 例如:一个 VARCHAR(255) utf8mb4 列可能占用 255*4+2=1022 字节,但实际存储的内容可能很短
  2. 部分索引使用:MySQL 可能只使用了索引的前缀部分

    • 对于字符串列,可能只使用了前 N 个字符
  3. 索引列的特殊属性

    • 如果列允许 NULL,每列增加 1 字节
    • 如果是可变长度类型,增加长度信息字节
  4. 字符集影响

    • 使用 utf8mb4 字符集的 VARCHAR 列会比 latin1 占用更多空间

具体案例分析

假设你的表结构如下:

CREATE TABLE example (
  id INT, 
  name VARCHAR(20) CHARSET utf8mb4,
  age INT,
  PRIMARY KEY (id, name, age)
);

对于这个复合主键,key_len 可能是: - id: 4 字节 - name: 20*4 + 2 = 82 字节 (utf8mb4 每个字符最多4字节) - age: 4 字节 总 key_len 可能是 90 字节

如果只使用了前两列,key_len 就是 86 字节;如果只使用了 id 列,就是 4 字节。

建议

要准确理解为什么你的查询 key_len 是 80: 1. 查看表结构和索引定义 2. 检查 EXPLAIN 输出中使用了哪些索引 3. 确认各列的数据类型、字符集和是否允许 NULL 4. 根据上述信息计算理论 key_len 并与实际值比较

如果你能提供具体的表结构和 EXPLAIN 输出,我可以给出更精确的分析。