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