您的位置:首页 > 数据库 > MySQL

通过执行计划,计算出mysql走的索引

2020-07-14 06:05 218 查看

通过执行计划,计算mysql走的索引

前言

在实际生产中,我们经常通过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走的索引,公式如下:

  1. 所有的索引字段,如果没有设置not null,则需要加一个字节;
  2. 定长字段,int占4个字节,date占3个字节,dateTime占5个字节(MySQL5.5版本之前占8个字节,5.5之后版本占5个字节),char(n)占n个字符
  3. 对于varchar(n),则占n个字符 + 2个字节;
  4. 不同的字符集,一个字符占用的字节数不同,latin1编码,一个字符占用一个字节,gbk编码,一个字符占两个字节,utf-8编码,一个字符占用三个字节;
  5. 那么,上述的char、varchar索引长度的计算公式为:
    长度 = (utf8mb4 = 4,utf8 = 3,gbk = 2,latin1 = 1) * 列长度 + 1(允许为null) + 2(变长列)

举例

有以下sql:

其显示的执行计划为:

索引为:

可以看出,sql随意输入的branch_id在表中是不存在的,优化器走的索引为idx_orders_branch_id_complete_at,key_len = 130
对于索引中的两个字段表结构如下:

根据公式:
key_len = 32 * 4(utf8mb4编码) + 2 = 130
则该sql只走了branch_id这个索引,并没有走完整的branch_id_complete_at索引,原因是因为我随意输入的branch_id在表中找不到相应数据,那么我输入一个库里存在的:
执行计划为:

可以看出,索引走了我们的idx_branch_id_pay_at,ken_len长度为136,根据公式:
key_len = 32 * 4(utf8mb4编码) + 2 + 5(date)+ 1(pay_at 可以为null) = 136

总结

如果对于公式很熟悉的话,我们很快的能通过我们的key_len来判断sql走了哪些索引,从而可以很快的找到解决方案,在实验中,我发现dateTime(n),如果n是0,则该字段为默认五个字节,如果n为1、2,则字段为六个,3、4为七个。。。以此类推,感兴趣的同学可以自己深究一下,好了,这次分享就到这里了。

越知道你就越不知道,技术有限,理解有限,欢迎指正~

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: