MySQL优化之:explain用法详解

前言:这篇文章主要讲 explain 如何使用,还有 explain 各类参数概念,以后会讲优化程序员

1、Explain 用法


模拟Mysql优化器是如何执行SQL查询语句的,从而知道Mysql是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。web

语法:Explain + SQL 语句;spring

如:Explain select * from user; 会生成以下 SQL 分析结果,下面详细对每一个字段进行详解sql

2、id


是一组数字,表明多个表之间的查询顺序,或者包含子句查询语句中的顺序,id 总共分为三种状况,依次详解数据库

  • id 相同,执行顺序由上至下缓存

  • id 不一样,若是是子查询,id 号会递增,id 值越大优先级越高,越先被执行微信

  • id 相同和不一样的状况同时存在性能

3、select_type


select_type 包含如下几种值学习

  • simple优化

  • primary

  • subquery

  • derived

  • union

  • union result

simple

简单的 select 查询,查询中不包含子查询或者 union 查询

primary

若是 SQL 语句中包含任何子查询,那么子查询的最外层会被标记为 primary

subquery

在 select 或者 where 里包含了子查询,那么子查询就会被标记为 subQquery,同三.二同时出现

derived

在 from 中包含的子查询,会被标记为衍生查询,会把查询结果放到一个临时表中

union / union result

若是有两个 select 查询语句,他们之间用 union 连起来查询,那么第二个 select 会被标记为 union,union 的结果被标记为 union result。它的 id 是为 null 的

4、table


表示这一行的数据是哪张表的数据

5、type


type 是表明 MySQL 使用了哪一种索引类型,不一样的索引类型的查询效率也是不同的,type 大体有如下种类

  • system

  • const

  • eq_ref

  • ref

  • range

  • index

  • all

system

表中只有一行记录,system 是 const 的特例,几乎不会出现这种状况,能够忽略不计

const

将主键索引或者惟一索引放到 where 条件中查询,MySQL 能够将查询条件转变成一个常量,只匹配一行数据,索引一次就找到数据了

eq_ref

在多表查询中,如 T1 和 T2,T1 中的一行记录,在 T2 中也只能找到惟一的一行,说白了就是 T1 和 T2 关联查询的条件都是主键索引或者惟一索引,这样才能保证 T1 每一行记录只对应 T2 的一行记录

举个不太恰当的例子,EXPLAIN SELECT * from t1 , t2 where t1.id = t2.id

ref

不是主键索引,也不是惟一索引,就是普通的索引,可能会返回多个符合条件的行。

range

体如今对某个索引进行区间范围检索,通常出如今 where 条件中的 between、and、<、>、in 等范围查找中。

index

将全部的索引树都遍历一遍,查找到符合条件的行。索引文件比数据文件仍是要小不少,因此比不用索引全表扫描仍是要快不少。

all

没用到索引,单纯的将表数据所有都遍历一遍,查找到符合条件的数据

6、possible_keys


这次查询中涉及字段上若存在索引,则会被列出来,表示可能会用到的索引,但并非实际上必定会用到的索引

7、key


这次查询中实际上用到的索引

8、key_len


表示索引中使用的字节数,经过该属性能够知道在查询中使用的索引长度,注意:这个长度是最大可能长度,并不是实际使用长度,在不损失精确性的状况下,长度越短查询效率越高

9、ref


显示关联的字段。若是使用常数等值查询,则显示 const,若是是链接查询,则会显示关联的字段。

  • tb_emp 表为非惟一性索引扫描,实际使用的索引列为 idx_name,因为 tb_emp.name='rose'为一个常量,因此 ref=const。

  • tb_dept 为惟一索引扫描,从 sql 语句能够看出,实际使用了 PRIMARY 主键索引,ref=db01.tb_emp.deptid 表示关联了 db01 数据库中 tb_emp 表的 deptid 字段。

10、rows


根据表信息统计以及索引的使用状况,大体估算说要找到所需记录须要读取的行数,rows 越小越好

11、extra


不适合在其余列显示出来,但在优化时十分重要的信息

using  fileSort(重点优化)

俗称 " 文件排序 " ,在数据量大的时候几乎是“九死一辈子”,在 order by 或者在 group by 排序的过程当中,order by 的字段不是索引字段,或者 select 查询字段存在不是索引字段,或者 select 查询字段都是索引字段,可是 order by 字段和 select 索引字段的顺序不一致,都会致使 fileSort

using temporary(重点优化)

使用了临时表保存中间结果,常见于 order by 和 group by 中。

USING index(重点)

表示相应的 select 操做中使用了覆盖索引(Coveing Index),避免访问了表的数据行,效率不错! 若是同时出现 using where,代表索引被用来执行索引键值的查找;若是没有同时出现 using where,表面索引用来读取数据而非执行查找动做。

Using wher

代表使用了 where 过滤

using join buffer

使用了链接缓存

impossible where

where 子句的值老是 false,不能用来获取任何元组

select tables optimized away

在没有 GROUPBY 子句的状况下,基于索引优化 MIN/MAX 操做或者 对于 MyISAM 存储引擎优化 COUNT(*)操做,没必要等到执行阶段再进行计算, 查询执行计划生成的阶段即完成优化。

distinct

优化 distinct,在找到第一匹配的元组后即中止找一样值的工做

下篇文章讲讲如何优化 MySQL 索引

关注微信公众号:IT 老哥

回复:Java 全套教程,便可领取:Java 基础、Java web、JavaEE 所有的教程,包括 spring boot 等

回复:简历模板,便可获取 100 份精美简历

回复:Java 学习路线,便可获取最新最全的一份学习路线图

回复:Java 电子书,便可领取 13 本顶级程序员必读书籍