千家信息网

mysql explain中key_len的含义以及计算方法是什么

发表于:2025-11-17 作者:千家信息网编辑
千家信息网最后更新 2025年11月17日,这篇文章主要为大家展示了"mysql explain中key_len的含义以及计算方法是什么",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"mysql ex
千家信息网最后更新 2025年11月17日mysql explain中key_len的含义以及计算方法是什么

这篇文章主要为大家展示了"mysql explain中key_len的含义以及计算方法是什么",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"mysql explain中key_len的含义以及计算方法是什么"这篇文章吧。

前言

在Mysql中执行explain的结果中有一列为key_len,那么key_len的含义是什么呢?

key_len:表示索引使用的字节数,根据这个值可以判断索引的使用情况,特别是在组合索引的时候,判断该索引有多少部分被使用到非常重要。

计算key_len注意事项:

  • 索引字段的附加信息: 可以分为变长和定长数据类型讨论,当索引字段为定长数据类型时,如char,int,datetime,需要有是否为空的标记,这个标记占用1个字节(对于not null的字段来说,则不需要这1字节);对于变长数据类型,比如varchar,除了是否为空的标记外,还需要有长度信息,需要占用两个字节。

  • 对于,char、varchar、blob、text等字符集来说,key len的长度还和字符集有关,latin1一个字符占用1个字节,gbk一个字符占用2个字节,utf8一个字符占用3个字节。

举例说明:

列类型KEY_LEN备注
id intkey_len = 4+1int为4bytes,允许为NULL,加1byte
id bigint not nullkey_len=8bigint为8bytes
user char(30) utf8key_len=30*3+1utf8每个字符为3bytes,允许为NULL,加1byte
user varchar(30) not null utf8key_len=30*3+2utf8每个字符为3bytes,变长数据类型,加2bytes
user varchar(30) utf8key_len=30*3+2+1utf8每个字符为3bytes,允许为NULL,加1byte,变长数据类型,加2bytes
detail text(10) utf8key_len=30*3+2+1TEXT截取部分,被视为动态列类型。

备注:key_len只指示了where中用于条件过滤时被选中的索引列,是不包含order by/group by这一部分被选中的索引列的。

例如,有个联合索引idx(c1,c2,c3),3列均是int not null,那么下面的SQL执行计划中,key_len的值是8而不是12:

select ... from tb where c1=? and c2=? order by c1;

示例

下面以具体的示例来进行说明,表结构:

CREATE TABLE `t4` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `a` int(11) NOT NULL DEFAULT '0',  `b` int(11) NOT NULL DEFAULT '0',  `c` int(11) NOT NULL DEFAULT '0',  PRIMARY KEY (`id`),  KEY `index1` (`a`,`b`)) ENGINE=InnoDB;

执行explain的结果如下:

mysql> explain select * from t4 where a =0 and b > 0;+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+| id | select_type | table | type  | possible_keys | key    | key_len | ref  | rows | Extra       |+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+|  1 | SIMPLE      | t4    | range | index1        | index1 | 8       | NULL |    1 | Using where |+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+mysql> explain select * from t4 where a > 0 and b = 0;+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+| id | select_type | table | type  | possible_keys | key    | key_len | ref  | rows | Extra       |+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+|  1 | SIMPLE      | t4    | range | index1        | index1 | 4       | NULL |    1 | Using where |+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+

可以看到a=0&b>0 和 a>0&b=0 explain的结果"几乎"相同,都用到索引index1,都是range这个索引(即对索引区间扫描)得到的结果。唯一不同的是key_len。key_len说明了查找时用到的索引长度,可以根据长度,推测多维索引用到了几维。(MySQL索引都是前缀索引)

index1是二维索引KEY index1 (a,b),因此长度应该是4+4。

a=0&b>0 key_len是8,说明仅仅用到了索引就能得到结果,先用a=0找到树节点,然后在其下面根据b>0过滤,得到结果。即"完全"用到索引就能得到结果。

a>0&b=0 key_len是4,说明仅仅用到了前缀索引的第一维,仅仅用a>0得到结果(主键),然后去主键索引(聚簇索引)里面读取整个行,根据b=0过滤相关数据,得到结果。即"不完全"用到索引才能得到结果。

以上是"mysql explain中key_len的含义以及计算方法是什么"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

索引 结果 字符 字节 类型 数据 长度 含义 方法 内容 字段 标记 篇文章 信息 前缀 备注 字符集 示例 部分 定长 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络运维难还是软件开发难 佛山市顺德区合意软件开发 数据库基础与应用是考察课 游戏软件开发笔记本 广州智慧园区软件开发费用 ajax实现连接数据库 网络安全靠人民主题文字 上海千鼎网络技术有限公司 传奇云服务器推荐 顺义区综合网络技术推广信息推荐 ibm服务器常见故障 上海技术网络技术参考价 网络安全的手抄报内容六年级 进口实时数据库模型批发 app进不去显示服务器异常什么意思 网络安全进村庄 泰安市铭金网络安全 网络安全检查ip管理分组名称 数据库脚本编程书籍 张家港便宜服务器高质量的选择 表格按日期提取数据库 适合在学校的软件开发 国顺网络安全有限公司怎么样 数据库嵌入snmp 电力通信机房的服务器叫什么 高可用服务器角色转移 意识形态与网络安全工作简报 峰哥讲数据库视频 浙江财经大学计算机数据库 如何清除数据库记录
0