SQL优化(五)索引长度

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

  1. 在utf8编码方式下,一个字符占3个字节。
  2. 如果索引字段可以为null,MySQL会使用1个字节标识。
  3. 如果索引字段的类型长度可变,MySQL会使用2个字节标识。

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

1.建表、建索引、插入数据

    建立一个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");

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

你可能感兴趣的:(MySQL基础)