前言
在实际生产中,我们经常通过explain关键字来查看sql的执行计划,执行计划中各字段的含义我这里就不多赘述,需要了解详情的可以点击查看。
我们需要注意的几个字段是访问类型type(ALL、index、range、 ref、eq_ref、const、system、NULL 从左到右,性能从差到好)、使用的索引key(key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中)、key_len(表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度)
其中key_len这个字段,可以通过数值判断执行计划中sql走的具体索引是什么,那要如何计算呢?别急,待我娓娓道来。
公式
我们可以通过一定的公式来通过key_len来计算sql走的索引,公式如下:
- 所有的索引字段,如果没有设置not null,则需要加一个字节;
- 定长字段,int占4个字节,date占3个字节,dateTime占5个字节(MySQL5.5版本之前占8个字节,5.5之后版本占5个字节),char(n)占n个字符;
- 对于varchar(n),则占n个字符 + 2个字节;
- 不同的字符集,一个字符占用的字节数不同,latin1编码,一个字符占用一个字节,gbk编码,一个字符占两个字节,utf-8编码,一个字符占用三个字节;
- 那么,上述的char、varchar索引长度的计算公式为: 长度 = (utf8mb4 = 4,utf8 = 3,gbk = 2,latin1 = 1) * 列长度 + 1(允许为null) + 2(变长列)
举例
有以下sql:
总结
如果对于公式很熟悉的话,我们很快的能通过我们的key_len来判断sql走了哪些索引,从而可以很快的找到解决方案,在实验中,我发现dateTime(n),如果n是0,则该字段为默认五个字节,如果n为1、2,则字段为六个,3、4为七个。。。以此类推,感兴趣的同学可以自己深究一下,好了,这次分享就到这里了。
越知道你就越不知道,技术有限,理解有限,欢迎指正~