explain select * from emp;

主要关注列:typepossible_keysrefkeyrowsExtra
1、id:
指示select字句或操作表的顺序。id相同,执行顺序从上到下,若存在子查询,则子查询(内层查询)id大于父查询(外层查询),先执行子查询。
2、select_type

select_type说明
SIMPLE简单查询,查询中不包含子查询或者UNION
PRIMARY最外层查询,查询中若包含任何复杂的子部分,最外层查询则被标记为:PRIMARY
SUBQUERY映射为子查询,在SELECT或WHERE列表中包含了子查询,该子查询被标记为:SUBQUERY
DERIVED子查询,在FROM列表中包含的子查询被标记为:DERIVED(衍生)
UNION联合,若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在 FROM子句的子查询中,外层SELECT将被标记为:DERIVED
UNION RESULT使用联合的结果,从UNION表获取结果的SELECT被标记为:UNION RESULT

3、table
当前SQL执行的表名
4、partitions
分区表
5、type
表示查询对应的类型

type说明
ALL全数据表扫描
index全索引表扫描
RANGE对索引列进行范围查找
INDEX_MERGE合并索引,使用多个单列索引搜索
REF根据索引查找一个或多个值
EQ_REF搜索时使用primary key 或 unique类型
CONST常量,表最多有一个匹配行,因为仅有一行,在这行的列值可被优化器剩余部分认为是常数,const表很快,因为它们只读取一次。
SYSTEM系统,表仅有一行(=系统表)。这是const联接类型的一个特例

性能(低到高):all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const性能在 range 之下基本都可以进行调优,如果没达到,可能要调整子语句或加索引
6、possible_keys
可选的索引,将表中可能用到的索引都罗列出来
7、key
判断SQL语句是否用到索引。这个值尽量不要为空
8、key_len
使用索引字节长度
9、ref
ref列显示将哪些列或常量与前面key列中显示的命名的索引进行比较以从表中选择行
10、rows
rows列表示MySQL认为执行查询必须检查的行数(只是一个预估值)
11、filtered
12、Extra
Using filesort
MySQL必须做一次额外操作,以找出如何按排序顺序检索行。排序是通过根据联接类型遍历所有行并存储与WHERE子句匹配的所有行的排序key和指向该行的指针来完成的。然后对key进行排序,并按排序顺序检索行。
Using index
仅使用索引树中的信息从表中检索列信息,而不需要执行额外的查找来读取实际行。当查询只使用属于单个索引的列时,可以使用此策略。
Using temporary
为了解析查询,MySQL需要创建一个临时表来保存结果。通常,如果查询包含以不同方式展示列的GROUP BY和ORDER BY子句,则会发生这种情况。
Using where
WHERE子句用于限制哪些行匹配下一个表或发送给客户端。除非你打算从表中获取或检查所有行,否则如果额外的值没有使用where,并且表连接类型是all或index,则查询中可能出现错误。
参考文献:
MySQL 执行计划 - 废物大师兄 - 博客园 (cnblogs.com)
mysql执行计划介绍_Mysql_脚本之家 (jb51.net)
https://mp.weixin.qq.com/s/Kktlo1-b2EF8tNvteb7_2w

最后修改:2022 年 11 月 24 日
如果觉得我的文章对你有用,请随意赞赏