暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql索引长度

后端Q 2023-02-03
99

在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个字节。

————————————————

版权声明:本文为CSDN博主「万里归来少年心」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/liyazhen2011/article/details/82787438


文章转载自后端Q,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论