MySQL Explain中key_len的计算

MySQL Explain中key_len的计算

通常在优化SQL查询的时候,我们都会使用explain分析SQL执行计划,通常来说当用到组合索引的时候我们如何判断索引完全用上呢?当然高手看看表结构及SQL语句就知道到底用到了几个字段,对于不熟悉的同学呢?我们还是可以看看key_len的长度,当然这个计算还是有点复杂的,下面我们来谈谈explain key_len如何计算的。

a.表结构如下:

CREATE TABLE keylen_cal (
id int(10) NOT NULL,
tel int(10) DEFAULT NULL,
first_name varchar(10) NOT NULL,
last_name varchar(10) DEFAULT NULL,
father char(10) NOT NULL,
mother char(10) DEFAULT NULL, PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
b.插入数据
insert into keylen_cal values (1,111,'A','AA','AAA','AAAA');
insert into keylen_cal values (2,222,'B','BB','BBB','BBBB');
insert into keylen_cal values (3,333,'C','CC','CCC','CCCC');
insert into keylen_cal values (4,444,'D','DD','DDD','DDDD');
c创建索引
alter table keylen_cal add index idx_id(id);
alter table keylen_cal add index idx_tel(tel);
alter table keylen_cal add index idx_fn(first_name);
alter table keylen_cal add index idx_ln(last_name);
alter table keylen_cal add index idx_father(father);
alter table keylen_cal add index idx_mother(mother);

d.测试每个key_len的长度

explain select * from keylen_cal where id=3;

id int(10) NOT NULL,

key_len=4

explain select * from keylen_cal where tel=33;

tel int(10) DEFAULT NULL,

key_len=5=4+1

alter table keylen_cal modify id(100) NOT NULL;
explain select * from keylen_cal where id=3;
key_len=4

explain select * from keylen_cal where first_name='C'

first_name varchar(10) NOT NULL,

key_len=32=10*3+2 (utf8占用三个字节)

explain select * from keylen_cal where last_name='CC'

last_name varchar(10) DEFAULT NULL,

key_len=33=10*3+2+1

explain select * from keylen_cal where father='CCC'

father char(10) NOT NULL

key_len=30=3*10

explain select * from keylen_cal where mother='CCCC'

mother char(10) DEFAULT NULL

key_len=31=3*10+1

通过上面的一系列实验,可以总结出来如下规律

通常情况下, key_len=字段字符数*字符集每个字符所占字节数

default null ,会使 key_len+1

变长的字段如varchar,会使key_len+2

int ,key_len=4

bigint, key_len=8

您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
本站大部分内容收集于互联网,如果有侵权内容、不妥之处,请联系删除。敬请谅解!

添加新评论

  关于博主【WANG-FEiHU】

Duplicate
-----------Complicate
--------------------------Appreciate
-----------------------------------------Fate

闻先后,术专攻
三人有师
习得文武艺,货与帝王家
人性不曾变,资本永无眠

-----------花有重开日,人无再少年-----------

  分类目录

  monitor(TD)

青春就是用来追忆的,当你怀揣着它时,它一文不值,只有将它耗尽后,再回过头看,一切才有了意义,爱过我们的人和伤害过我们的人,都是我们青春存在的意义。

在这有限的时间里,我们应该珍惜生命,珍惜机会,更要珍惜那得之不易的时间。因那滴答做响的时间脚步,一旦走过,再不回头。

要打败任何事情得先学会打败自己。

我会把每一次改变当做成长,哪怕是痛也值得。

时无英雄,使竖子成名

少年不识愁滋味,爱上层楼。爱上层楼。为赋新词强说愁。而今识尽愁滋味,欲说还休。欲说还休。却道天凉好个秋。