mysql-性能分析

简介

使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,对查询语句或表结构进行性能分析。

使用:Explain + SQL Query(SELECT/DELETE/INSERT/REPLACE/UPDATE)。如:EXPLAIN SELECT * FROM t;

执行计划包含如下内容:

| id | select_type | table | type | possible_keys | key |key_len | ref | rows | filtered | Extra |

整体说明如下:

字段 说明
id 查询序列号,表示查询中执行select子句或操作表的顺序。id越大优先级越高,相等时从上到下执行
select_type 查询类型
table 输出行的表名
type 访问类型
possible_keys 可能会被使用到的索引
key 实际使用的索引
key_len 索引字段最大可能的长度
ref 显示索引的那一列被使用了;哪些列或常量被用于查找索引列上的值
rows 大致估算需要读取的行数
filtered 按表条件过滤的行的百分比
Extra 额外的信息

各列含义

select_type

select_type 值 含义
SIMPLE 简单的 SELECT 查询,查询中不包含子查询或者UNION
PRIMARY 查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARY
UNION UNION连接的SELECT查询,除第一个表外,第二个及以后的表 select_type 都是UNION
SUBQUERY 在SELECT或WHERE列表中包含的子查询(不包含 FROM)
DERIVED FROM列表中包含的子查询

type

type 含义
system 表中只有一行或者空表,只用于MYISAM或MEMORY表
const 使用唯一索引或主键,最多只有一个匹配行。
表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快
如将主键置于where列表中,MySQL就能将该查询转换为一个常量
eq_ref 当连接使用索引的所有部分且索引是 PRIMARY KEY或UNIQUE NOT NULL索引时使用它。
唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
ref 对于上一个表中的每个行组合,将从此表中读取所有具有匹配索引值的行。
非唯一性索引扫描,返回匹配某个单独值的所有行。
本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,
它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体
range 索引范围扫描,常用于 =、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN、IN()、LIKE等查询中
index 索引树扫描。查询使用覆盖索引,仅扫描索引树,此种情况下,Extra=Using index
all 全表扫描

Extra

Extra 含义
using index 使用了覆盖索引,不需要回表。
表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错!
如果同时出现using where,表明索引被用来执行索引键值的查找;
如果没有同时出现using where,表明索引用来读取数据而非执行查找动作。
using where 表示存储引擎返回的记录并不满足所有的查询条件,需要在服务层进行过滤
using index condition 使用了索引下推,在存储引擎层判断查询条件。
using temporary 使用临时表来存储结果集,常见于排序和分组查询。
使了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by。
using filesort 使用文件排序。
说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。
MySQL中无法利用索引完成的排序操作称为“文件排序”。
using join buffer 使用了连接缓存
impossible where子句的值总是false,不能用来获取任何元组
select tables optimized away 在没有GROUPBY子句的情况下,基于索引优化MIN/MAX操作或者
对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,
查询执行计划生成的阶段即完成优化。
distinct 优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作

索引下推
查询条件分为限制条件和检查条件,5.6之前,存储引擎只能根据限制条件扫描数据并返回,然后SERVER层根据检查条件进行过滤再返回真正符合查询的数据。5.6.x之后支持ICP特性,可以把检查条件也下推到存储引擎层,不符合检查条件和限制条件的数据,直接不读取,这样就大大减少了存储引擎扫描的记录数量。

0%