博主
258
258
258
258
专辑

MySQL执行计划Explain参数详解

还怕大雨吗. 2022-02-15 07:41:28 3655 0 0 0

所谓执行计划就是看sql执行情况,有没有走索引啊之类的

很简单,在你的select语句前面加个EXPLAIN就行

比如我的查询语句是
SELECT * FROM pool WHERE operating_status = “OFFLINE”
那他的执行计划就这么看

EXPLAIN SELECT * FROM pool WHERE operating_status = "OFFLINE"

返回结果
图片alt
从这个反馈就能看出你这个sql的执行情况

字段含义:

id:如果是子查询,表示各个子查询的顺序

id相同:执行顺序由上往下
id不同:id大的先执行
id为空:表示一个结果集,不需要使用它查询,常出现在包含union等查询语句中

select_type:查询的类型

SIMPLE:简单select查询
PRIMARY:包含子查询的最外层查询,比如select * from tableA where id = (select b_id from tableB where name = “蔡徐鸡”)
SUBQUERY:在select或 where子句中包含的查询,比如select * from tableA where id = (select b_id from tableB where name = “蔡徐鸡”)
DERIVED:from子句中包含的查询
UNION:出现在union后的查询语句中
UNION RESULT:从UNION中获取结果集当前执行计划的最后一条记录

table:查询中涉及到的表

如果表有别名那就显示别名

type:访问类型
这个属性值很重要,代表访问类型,性能由上往下逐渐降低

system:表只有一行:system表。这是const连接类型的特殊情况。
const :表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。
eq_ref:对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用。
ref:只有在查询使用了不是唯一或主键的key或者是这些类型的部分(比如,利用最左边前缀)时发生。
range:使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况。
index:对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)。
ALL:对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免。

possible_keys:可能用到的索引

查询涉及字段上若存在索引,就会列出来。当该列为 NULL时就要考虑当前的SQL是否需要优化了

key:实际用的索引

查询中实际使用的索引,若没有使用索引,显示为Null

key_length:索引长度

char()、varchar()索引长度的计算公式:(Character Set:utf8mb4=4,utf8=3,gbk=2,latin1=1) * 列长度 + 1(允许null) + 2(变长列)

ref:连接匹配条件

表示上述表的哪些列被用于查找索引列上的值,如果是使用的常数等值查询,这里会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段,如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func。

rows:估算的查询结果行数

估算的,可能不准确

extra:附加信息
这个属性值也很重要

Using index:使用覆盖索引
Using where:使用了用where子句来过滤结果集
Using filesort:使用文件排序,使用非索引列进行排序时出现,非常消耗性能,尽量优化
Using temporary:使用了临时表