ITPub博客

首页 > 数据库 > MySQL > MySQL explain 中 key_len的详解

MySQL explain 中 key_len的详解

原创 MySQL 作者:haoge0205 时间:2020-04-07 22:58:24 0 删除 编辑

MySQL explain中key_len的计算

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

在计算key_len时,下面是一些需要考虑的点:

索引字段的附加信息:

1.可以分为变长和定长数据类型讨论;

2.当索引字段为定长数据类型时,如char,int,datetime,需要有是否为空的标记,这个标记占用一个字节(对于not null来说不需要这一个字节);

3.当索引字段为变长数据类型时,如varchar,除了是否为空的标记外,还需要有长度信息,需要占用两个字节;

4.对于char,varchar,blob,text等,key_len的长度还和字符集有关,latin1 一个字符占用一个字节,gbk 一个字符占用两个字节,utf8 一个字符占用三个字节

例如:

列类型          KEY_LEN                        备注

id int                 key_len = 4+1                 int为4bytes,允许为NULL,加1byte

id bigint not null key_len=8                 bigint为8bytes

user char(30) utf8 key_len=30*3+1         utf8每个字符为3bytes,允许为NULL,加1byte

user varchar(30) not null utf8 key_len=30*3+2 utf8每个字符为3bytes,变长数据类型,加2bytes

user varchar(30) utf8 key_len=30*3+2+1 utf8每个字符为3bytes,允许为NULL,加1byte,变长数据类型,加2bytes

detail text(10) utf8 key_len=30*3+2+1        TEXT截取部分,被视为动态列类型

备注:

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

例如:

有一个联合索引idx(a1,b2,c3),三列均是 int not null,那么下面的执行计划中key_len的值是8,不是12

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


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28939273/viewspace-2684894/,如需转载,请注明出处,否则将追究法律责任。

上一篇: MySQL explain 详解
下一篇: Linux awk 命令详解
全部评论

注册时间:2013-11-28

  • 博文量
    286
  • 访问量
    1725273