mysql索引长度

在SQL执行计划中,key_len 表示索引长度,经常用于判断复合索引是否被完全使用。先说结论:

在utf8编码方式下,一个字符占3个字节。

如果索引字段可以为null,MySQL会使用1个字节标识。

如果索引字段的类型长度可变,MySQL会使用2个字节标识。

下面详细分析SQL执行计划中的索引长度。.

建表、建索引、插入数据

建立一个person表,仅有非空name列。在name上建立索引,并插入三条数据。相应的SQL语句如下:

create table person
(
   name char(20) not null
);
alter table person add index idx_name(name);
insert into person values("sql");
insert into person values("java");
insert into person values("html");

SQL执行计划

2.1 索引非空     在建表时,我们设置name为非空列,现在分析下面一条查询语句的执行计划。

explain select * from person where name ='sql';

执行计划如下:

key_len = 60,索引段name的长度是20个字符,key_len = 20*3 = 60。

这验证了第1条结论:在utf8编码方式下,一个字符占3个字节。

2.2索引可空

现在我们稍作改动,允许name列为空。执行同样的查询语句,看看执行计划会有什么变化?

alter table person modify name char(20) null;

执行计划如下:

key_len = 61,索引段name的长度是20个字符,key_len = 20*3 + 1= 61。

这验证了第2条结论:如果索引字段可以为null,MySQL会使用1个字节标识。

2.3索引可变长度类型

继续改动,将name列的类型改为可变长度类型varchar(20),执行上述同样的查询语句,看看执行计划会有什么变化?

alter table person modify name varchar(20) ;

执行计划如下:

key_len = 63,索引段name的长度是20个字符,key_len = 20*3 + 1 + 2= 63。

这验证了第3条结论:如果索引字段的类型长度可变,MySQL会使用2个字节标识。

2.4复合索引

给person表增加一列address,address列可以为空。建立复合索引(name,address),查看复合索引下的SQL执行计划。

alter table person add Column address varchar(20);
alter table person add index idx_name_address(name,address);
explain select * from person where name ='';

执行计划如下:

key_len = 63,说明该SQL查询语句只用了复合索引的前半部分。

explain select * from person where address ='';

执行计划如下:

key_len = 126,说明该SQL查询语句用了整个复合索引。

综上,key_len 表示索引长度,经常用于判断复合索引是否被完全使用。

注:utf8中一个字符占3个字节;gbk中一个字符占2个字节;latin中一个字符占1个字节。