MySQL explain SQL执行分析

MySQL explain SQL执行分析

explain 字段解释

看一条简单的执行计划

explain select * from t_user where id = 1;

id

含义:是一组数字,表示的是查询中执行 select 子句或者是操作表的顺序

规则:

  • id 不相同的,id 值越大越先执行
  • id 相同的,从上到下顺序执行

select_type

常见的值以及描述如下

描述
SIMPLE 简单的 SELECT 语句(不包括 UNION 操作或子查询操作)
PRIMARY 查询中最外层的 SELECT(如两表做 UNION 或者存在子查询的外层的表操作为 PRIMARY,内层的操作为 UNION)
UNION UNION 操作中,查询中处于内层的 SELECT,即被 union 的 SELECT
SUBQUERY 子查询中的 SELECT
DERIVED 表示包含在 From 子句中的 Select 查询
UNION RESULT union 的结果,此时 id 为 NULL

table

涉及的表

type(重要)

这列很重要,显示了连接使用哪种类型,有无使用索引, 常见的值从最好到最差如下 system > const > eq_ref > ref > range > index > all

各值的描述如下

描述
system 表只有一行,MyISAM 引擎所有
const 常量连接,表最多只有一行匹配,通常用于主键或者唯一索引比较时,如:select * from t_user where id = 1;
eq_ref 表关联查询时,对于前表的每一行,后表只有一行与之匹配。(1) join 查询(2) 命中主键或者非空唯一索引
ref 只使用了索引的最左前缀或者使用的索引是非唯一索引、非主键索引
range between,in,>等都是典型的范围(range)查询
index 需要扫描索引上的全部数据,如:select count(*) from t_user;
all 全表扫描

possible_keys

表示可能用到的索引

key

表示最终用到的 key

ref

显示索引的哪一列被使用了,有时候会是一个常量:表示哪些列或常量被用于查找索引列上的值

rows

估算出结果集行数,表示 MySQL 根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数, 原则上 rows 越少越好。

filtered

查询结果的行数占上面 rows 的百分比

Extra(重要)

这一列也很重要,主要展示额外的信息说明,能够给出让我们深入理解执行计划进一步的细节信息

常见的值及描述如下

描述
Using filesort 当 order by 无法利用索引完成排序时,优化器不得不选择合适的算法从内存或者磁盘进行排序
Using temporary 使用了临时表
Using index select 后面的查询字段在索引中就可以取到,无需再回表了,即所谓的覆盖索引,这种查询性能很好
Using index condition mysql5.6 之后引入了 ICP(索引条件下推)
Using where Mysql 服务器在存储引擎检索行后再进行过滤