文章

MySQL explain 使用说明

官网说明

  • explain SQL; 不真正执行,数值都是估计值
  • explain for connection_id; 查看当前会话的执行计划(select connection_id();)
  • explain analyze SQL; 提供执行计划,执行SQL语句

explain 使用格式

{EXPLAIN | DESCRIBE | DESC}
    tbl_name [col_name | wild]

{EXPLAIN | DESCRIBE | DESC}
    [explain_type]
    {explainable_stmt | FOR CONNECTION connection_id}

{EXPLAIN | DESCRIBE | DESC} ANALYZE [FORMAT = TREE] select_statement

explain_type: {
    FORMAT = format_name
}

format_name: {
    TRADITIONAL
  | JSON
  | TREE
}

explainable_stmt: {
    SELECT statement
  | TABLE statement
  | DELETE statement
  | INSERT statement
  | REPLACE statement
  | UPDATE statement
}

explain 字段信息解释

  • select type 查询类型
PRIMARY:        主查询,sql中包含有子查询
SUBQUERY:       子查询 
SIMPLE:        普通查询 (不含有子查询和union 连接查询的查询)
DERIVED:        衍生查询 (使用到了临时表)
union:          使用到了union 连接查询
union result:  显示哪些表之间使用了union
  • table 表名
  • type 索引类型
常用到的类型性能:system > const > eq_ref > ref > range > index > all
system : 表中只有一条数据的主查询
const : 查询结果只有一条数据的sql ,并且索引类型必须为主键索引或者唯一索引
eq_ref : 查询结果可以有多条数据,但满足where判断条件的每一条数据必须是唯一的一条数据(不能多条也不能为0条)。
ref : 索引查询返回匹配所有行(0条,多条)
range : 检索指定范围的行,where后面是一个范围查询(between , in , > , < 等 其中in可能会导致索引失效而变成 all)
index : 查询全部索引的数据
all :查询全部表的数据(sql 将表的所有数据都查了一遍) ,没有用到索引时常出现
  • possible_keys 可供选择的索引
  • key 实际用到的索引
  • key_len 实际使用到索引的长度(utf8 1个字符3个字节)
  • ref 表之间的引用,指明当前表所参照的字段
const: 判断条件中用到了常量 或者 显示用到了其他表的那些字段
  • rows 估计查询了表中的数据行数(MySQL认为必须检查以执行查询的行数)
  • extra
using filesort : 性能损耗大,需要额外的查询(排序) ,常见于 order by 语句中
1.当排序和查找不是同一个字段就会出现using filesort
2.复合索引不能跨列(最佳左前缀)否则会出现using filesort

using temporary:性能损耗大,用到了临时表,一般出现与 group by 语句中

using index: 性能提升,只从索引中查询数据,不需要回表查询

using where: 进行了回表查询

impossible where : where 查询条件永远为fasle

using join buffer : MySQL引擎使用了连接缓存,表示sql语句太烂,性能低下
License:  CC BY 4.0