作者:互联网 时间: 2026-08-25 09:59:56
计算 key_len 就像做加法题,我们需要把生效索引列的 【数据类型长度】 + 【NULL 标记】 + 【变长类型标记】 全部加在一起。

整数类:TINYINT = 1 字节 | SMALLINT = 2 字节 | INT = 4 字节 | BIGINT = 8 字节。
时间类(MySQL 5.6 之后):DATE = 3 字节 | TIMESTAMP = 4 字节 | DATETIME = 5 字节。
如果使用 gbk:每个字符最多占 2 字节。
如果使用 utf8:每个字符最多占 3 字节。
如果使用 utf8mb4(目前最通用):每个字符最多占 4 字节。例:VARCHAR(20) 且字符集为 utf8mb4,基础长度 = 20 × 4 = 80 字节。
NULL 属性标记:如果该字段允许为 NULL(没有设置 NOT NULL),MySQL 需要额外用 1 字节来存储 NULL 标记。
变长类型标记:如果是 VARCHAR 等变长字符串,MySQL 需要额外用 2 字节来记录字符串的实际物理长度。
CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(20) DEFAULT NULL, -- 允许为 NULL,变长 age INT NOT NULL,-- 不允许为 NULL,定长 PRIMARY KEY (id), KEY idx_name_age (name, age)-- 联合索引 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- 采用 utf8mb4 字符集
当你运行不同的查询语句并查看 EXPLAIN 时,可以通过 key_len 逆向推导:
EXPLAIN SELECT * FROM users WHERE name = 'Bob' AND age = 23;
EXPLAIN SELECT * FROM users WHERE name = 'Bob';
EXPLAIN SELECT * FROM users WHERE name LIKE 'B%' AND age = 23;