且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

mysql执行计划explain属性解析

更新时间:2022-04-17 20:49:01

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

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

比如我的查询语句是

SELECT * FROM pool WHERE operating_status = “OFFLINE”

那他的执行计划就这么看

EXPLAIN SELECT * FROM pool WHERE operating_status = "OFFLINE"

反馈结果:

mysql执行计划explain属性解析

从这个反馈就能看出你这个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:使用了临时表