如何通过EXPLAIN中key_len判断联合索引生效字段
时间:2026-08-18 | 作者:怪兽小助手 | 阅读:0计算 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, -- name 字段允许为 NULL,而且是变长类型 age INT NOT NULL, -- age 字段不允许为 NULL,属于定长类型 PRIMARY KEY (id), KEY idx_name_age (name, age) -- 这里建的是 name 和 age 的联合索引 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 表引擎使用 InnoDB,字符集采用 utf8mb4
第一步:单独计算每个字段的索引长度
-
name 字段的长度
基础长度:20 (字符) × 4 (utf8mb4) = 80 字节
允许为 NULL:+1 字节
变长字符串(VARCHAR):+2 字节
单列总计:80 + 1 + 2 = 83 字节
-
age 字段的长度
基础长度:INT 类型 = 4 字节
不允许为 NULL(NOT NULL):+0 字节
定长类型:+0 字节
单列总计:4 字节
第二步:看 EXPLAIN 结果做加法
当你运行不同的查询语句并查看 EXPLAIN 时,可以通过 key_len 逆向推导联合索引到底用了哪些字段。
场景 1:完全匹配
EXPLAIN SELECT * FROM users WHERE name = 'Bob' AND age = 23;
key_len 结果:87
推导逻辑:83 (name) + 4 (age) = 87。
说明 name 和 age 两个字段都走了解析和索引过滤。
场景 2:最左匹配,漏掉右边
EXPLAIN SELECT * FROM users WHERE name = 'Bob';
key_len 结果:83
推导逻辑:正好等于 name 字段的长度。
说明只有 name 走了解索引。
场景 3:范围查询导致右边失效
EXPLAIN SELECT * FROM users WHERE name LIKE 'B%' AND age = 23;
key_len 结果:83
推导逻辑:虽然条件里写了 age = 23,但 key_len 只有 83。
因为 name 使用了模糊范围查询(LIKE ‘B%’),导致在 B+ 树指路时,右边的 age 无法再利用索引进行有序过滤了。
此时只有 name 索引生效。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 如何使用 SQL EXPLAIN 分析 SELECT 执行计划
- 时间:2026-08-25
精选合集
更多大家都在玩
大家都在看
更多-
- 糖尿病完全不能吃糖吗
- 时间:2026-09-15
-
- 蚂蚁庄园小课堂2026年9月16日最新题目答案
- 时间:2026-09-15
-
- 小鸡答题今天的答案是什么2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园每日答题答案2026年9月16日
- 时间:2026-09-15
-
- 以下哪种粮食是酿造绍兴黄酒的主要原料 蚂蚁庄园今日答案9月16日
- 时间:2026-09-15
-
- 劝学名句“及时当勉励,岁月不待人”出自哪位诗人 蚂蚁庄园今日答案9.16
- 时间:2026-09-15
-
- 蚂蚁庄园今天答题答案2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园答题今日答案2026年9月16日
- 时间:2026-09-15
