SQL优化(五)索引长度

您所在的位置:网站首页 数据备份时间过长会怎么样 SQL优化(五)索引长度

SQL优化(五)索引长度

#SQL优化(五)索引长度| 来源: 网络整理| 查看: 265

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

在utf8编码方式下,一个字符占3个字节。如果索引字段可以为null,MySQL会使用1个字节标识。如果索引字段的类型长度可变,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个字节。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3