数据库优化 ( 一 ) 执行计划 EXPLAIN

4.1.EXPLAIN 执行计划

EXPLAIN 执行计划 是MySQL的一个分析工具,主要用来测试sql语句的性能及对sql语句的优化,或者说模拟优化器执行SQL语句。

通过explain我们可以获得以下信息:

  • 表的读取顺序
  • 数据读取操作的操作类型
  • 哪些索引可以使用
  • 哪些索引被实际使用
  • 表之间的引用
  • 每张表有多少行被优化器查询
explain select ....(查询语句)

测试查询

explain select student_id,student_name,student_enrollmenttime, student_tel,stu.education_id,student_weight, 
student_bloodtype,student_sex , student_height , edu.education_name , 
case student_sex when 1 then '男' when 0 then '女' else '不清楚' end student_sex_name
 from student stu left join education edu on stu.education_id = edu.education_id 
WHERE student_weight >= 150.0 and student_weight <= 151.0 LIMIT 10 

执行结果

在这里插入图片描述

4.1.1.执行结果说明

1.id : 这是SELECT查询序列号。

如果explain的结果包括多个id值,则数字越大越先执行;而对于相同id的行,则表示从上往下依次执行。

explain select * from ( select *  from student limit 10 ) lin

它的执行结果为

在这里插入图片描述

可以看到这时的id变化了

2.select_type : select类型,它有以下几种值

(1) SIMPLE (简单SELECT,不使用UNION或子查询等)

(2) PRIMARY (子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)

(3) UNION (UNION中的第二个或后面的SELECT语句)

(4) DEPENDENT UNION (UNION中的第二个或后面的SELECT语句,取决于外面的查询)

(5) UNION RESULT (UNION的结果,union语句中第二个select开始后面所有select)

(6) SUBQUERY (子查询中的第一个SELECT,结果不依赖于外部查询)

(7) DEPENDENT SUBQUERY (子查询中的第一个SELECT,依赖于外部查询)

(8) DERIVED (派生表的SELECT, FROM子句的子查询)

(9) UNCACHEABLE SUBQUERY (一个子查询的结果不能被缓存,必须重新评估外链接的第一行)

3.table : 表名 输出的行所用的表, 如果SQL定义了别名,则展示表的别名

4.partitions : 匹配的分区

4.type : 连接类型。有多个参数,先从最佳类型到最差类型介绍 重要且困难

(1) system : 该表只有一行(相当于系统表),system是const类型的特例

(2) const : 针对主键或唯一索引的等值查询扫描, 最多只返回一行数据. const 查询速度非常快, 因为它仅仅读取一次即可

explain select student_id, student_name from student where student_id=1

在这里插入图片描述

student_id 是主键,所以使用了const。所以说可以理解为const是最优化的

(3) eq_ref : 当使用了索引的全部组成部分,并且索引是PRIMARY KEY或UNIQUE NOT NULL 才会使用该类型(唯一类型索引),

性能仅次于system及const。

(4)ref : 当满足索引的最左前缀规则,或者索引不是主键也不是唯一索引时才会发生。

如果使用的索引只会匹配到少量的行,性能也是不错的。

explain select * from student where education_id = 1

它的执行结果为

在这里插入图片描述

(5) ref_or_null : 该类型类似于ref,但是MySQL会额外搜索哪些行包含了NULL。这种类型常见于解析子查询

上面这五种情况都是很理想的索引使用情况

(6) range : 范围扫描,表示检索了指定范围的行,主要用于有限制的索引扫描。比较常见的范围扫描是带有BETWEEN子句或WHERE子句里有>、>=、<、<=、IS NULL、<=>、BETWEEN、LIKE、IN()等操作符。

(7) index : 只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小。(也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘中读的)当查询只使用作为单索引一部分的列时,MySQL可以使用该联接类型。

(8) ALL : 对于每个来自于先前的表的行组合,进行完整的表扫描。

(9) index_merge : 此类型表示使用了索引合并优化,表示一个查询里面用到了多个索引

(10) unique_subquery : 该类型和eq_ref类似,但是使用了IN查询,且子查询是主键或者唯一索引。

(11) index_subquery : 和unique_subquery类似,只是子查询使用的是非唯一索引

5.possible_keys : 提示使用哪个索引会在该表中找到行,不太重要

6.keys : MYSQL使用的索引,简单且重要

7.key_len : MYSQL使用的索引长度

8.ref : ref列显示使用哪个列或常数与key一起从表中选择行。

9.rows : 显示MYSQL执行查询的行数,简单且重要,数值越大越不好,说明没有用好索引

10.filtered : 读取的行数与返回行数的百分比, 越高越好

11.Extra : 该列包含MySQL解决查询的详细信息。

(1) using index : 只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的信息。这个比较容易理解,就是说明是否使用了索引 (最好)

(2) Using where : 不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示MySQL服务器将在存储引擎检索行后再进行过滤 (好)

(3) Using temporary :表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询,常见 group by ; order by (不是最好)

(4) Using filesort :当Query中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序” (不好)

(5) Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。

(6) Impossible where : 这个值强调了where语句会导致没有符合条件的行(通过收集统计信息不可能存在结果)。

(7) Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行

(8) No tables used :Query语句中使用from dual 或不含任何from子句

(9) Distinct : MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。

(10) Not exists :

(11) range checked for each record : 没有找到合适的索引

(12) Using sort_union(…) , Using union(…) , Using intersect(…) : 这些函数说明如何为index_merge联接类型合并索引扫描

(13) Using index for group-by : 类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。并且,按最有效的方式使用索引,以便对于每个组,只读取少量索引条目。

重要的信息

字段解释介绍
type连接类型ALL: 全表扫描
index: 索引
range: 范围查找
ref: 使用非唯一性索引或者唯一索引的前缀扫描
eq_ref: 对于每个索引键值,只有唯一的一条匹配记录
const/system: 单表中最多只有一条匹配行,查询起来非常迅速,
所以这个匹配行中的其他列中的值可以被优化器在当前查询中当做常量来处理。
例如根据主键或者唯一索引进行的查询
possible_keys可能存在的索引
key使用的索引
rows扫描行数, 越小越好
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值