SQL优化(五)索引长度 |
您所在的位置:网站首页 › 数据备份时间过长会怎么样 › SQL优化(五)索引长度 |
在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 |