MySQL优化-explain

56 阅读3分钟

blog.csdn.net/jiadajing26…

blog.csdn.net/zhanyd/arti…

1. 简介****

explain模拟优化器执行SQL语句,在5.6以及以后的版本中,除过select,其他比如insert,update和delete均可以使用explain查看执行计划,从而知道mysql是如何处理sql语句,分析查询语句或者表结构的性能瓶颈。  

2. 作用****

1、表的读取顺序

2、数据读取操作的操作类型

3、哪些索引可以使用

4、哪些索引被实际使用

5、表之间的引用

6、每张表有多少行被优化器查询

3. explain用法****

explain+SQL语句即可,示例

image.png

执行计划包含的信息如下

信息描述
id查询语句的序号
select_type选择类型,比如SIMPLE:简单查询(没有使用联合和子查询)PRIMARY查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARYSUBQUERY:子查询中的第一个SELECTUNION: 如果第二个select出现在UNION之后,则被标记为UNION
table输出行的表名
partitions分区表信息,没有分区表则为NULL
type连接类型,显示查询使用了何种类型,以下按照从最佳到最坏类型排序 system: 表中仅有一行(=系统表)这是const联结类型的一个特例。②const: 表示通过索引一次就找到,const用于比较primary key(主键索引)或者unique(唯一索引)索引。搜索结果只有一条数据,mysql能将该查询转换为一个常量,速度最快(除system外)。③eq_ref: 相等表连接查询,也是主键索引或者唯一索引全部被命中,表中只有一条记录与之匹配。④ref: 普通连接查询,使用最左前缀匹配索引(索引不是主键,也不是唯一索引),会匹配到了多行数据⑤range: 通过索引范围查找多行数据,比全表扫描要好,因为它开始于索引的某一个点,而结束另一个点,不用全表扫描 ⑥index: index类型和ALL类型一样,区别就是index类型是扫描的索引树,不需要回表查询,按索引的顺序来查找数据行⑦ALL: 全表扫描,效率最低的查询,一般可以通过添加索引避免
possible_keys可供选择的索引
key实际选择的索引
key_len选择的索引的长度,长度越短越好
ref和索引匹配的列
rows估算的扫描行数,根据表统计信息以及索引选用情况估算
Extra包含不适合在其他列中显示,但是十分重要的额外信息1、Using filesort:说明mysql会对数据适用一个外部的索引排序。而不是按照表内的索引顺序进行读取。2、Using temporary:使用了临时表保存中间结果,在查询结果排序时使用临时表。常见于排序order by和分组查询group by。3、Using index:表示相应的select操作用使用覆盖索引,避免访问了表的数据行。如果同时出现using where,表名索引被用来执行索引键值的查找;如果没有同时出现using where,表名索引用来读取数据而非执行查询动作。4、Using where :表明使用where过滤5、using join buffer:使用了连接缓存6、impossible where:where子句的值总是false,不能用来获取任何元组7、select tables optimized away:在没有group by子句的情况下,基于索引优化Min、max操作或者对于MyISAM存储引擎优化count(*),不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。8、distinct:优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作。

  

4. SQL执行顺序****

完整SQL语句

select distinct <select_list> 

from  <left_table><join_type>

join <right_table> on <join_condition>

where <where_condition>

group by <group_by_list>

having <having_condition>

order by <order_by_condition>

limit

 

执行顺序是

from  on  join  where  group by  having  select  distinct  order by limit

image.png