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 服务器在存储引擎检索行后再进行过滤 |