mysql explain中key_len的作用
key_len越小 索引效果越好
name的字段类型是varchar(20),字符编码是utf8,一个字符占用3个字节,那么key_len应该是 20*3=60。
mysql> explain select * from `member` where name='fdipzone'; +----+-------------+--------+------+---------------+------+---------+-------+------+-----------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+--------+------+---------------+------+---------+-------+------+-----------------------+ | 1 | SIMPLE | member | ref | name | name | 63 | const | 1 | Using index condition |
列名 |
用途 |
id |
每一个SELECT关键字查询语句都对应一个唯一id |
select_type |
SELECT关键字对应的查询类型 |
table |
表名 |
partitions |
匹配的分区信息 |
type |
单表的访问方法 |
possible_keys |
可能用到的索引 |
key |
实际使用到的索引 |
key_len |
实际使用到的索引长度 |
ref |
当使用索引列等值查询时,与索引列进行等值匹配的对象信息 |
rows |
预估需要读取的记录条数 |
filtered |
某个表经过条件过滤后剩余的记录条数百分比 |
Extra |
额外的一些信息 |
所以:
1 . 设置字段长度尽量小
2 . 用定长char (key_len会少1)
3 . 用not null(key_len会少1)
key_len表示索引使用的字节数,根据这个值,就可以判断索引使用情况,特别是在组合索引的时候,判断所有的索引字段是否都被查询用到。
char和varchar跟字符编码也有密切的联系,latin1占用1个字节,gbk占用2个字节,utf8占用3个字节。(不同字符编码占用的存储空间不同)
1、索引字段为char类型的key_len计算:
(1)允许为Null时
可以看到key_len=31,这个31是字节长度,它是怎么算出来的呢?让我们一起来分析下:
从表结构可以看到字符集是utf8,那就一个字符3个字节,那么char(10)代表的是10个字符相当30个字节,Null 占1个字节,char类型不需要额外的字节来存储值的的长度,所以得到:key_len:10x3+1=31,可以看到跟上面的结果一致的。
(2)不允许为Null时
算法和上面差不多,只是字段不允许为Null,所以比上面的例子少了一个字节,key_len=10x3=30
2、索引字段为varchar类型且允许为Null时的key_len计算:
(1)允许为Null时
还是utf8的字符集,所以还是一个字符3个字节,那么varchar(10)就是10个字符30个字节,Null占一个字节,由于varchar类型需要额外的1~2字节来存储值的的长度:所以key_len:10x3+1+2=33
(2)不允许为Null时
相信大家都会算了吧,哈哈,不允许为Null就少了一个字符,所以Key_len:10x3+2=32