博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mysql基础课十三:explain 分析
阅读量:3731 次
发布时间:2019-05-22

本文共 3783 字,大约阅读时间需要 12 分钟。

oracle 的 explain

  1. oracle 的 explain 用法,先调用 explain plan for sql 语句,后调用 select plan_table_output from 来获取 explain 结果,注意这里的 sql 语句,并不会真正执行;
explain plan for select * from THIRD_ORDER_INFO t left join MER_INFO m on t.MER_NO = m.MER_NO where 		m.PROVICE_CODE = '11';	SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));
  1. explain 计划,缩进最多的先执行,同样缩进,从上往下执行;

    在这里插入图片描述

  2. operation 表示当前操作内容,rows 表示 oracle 预估当前操作返回的结果集,

// 表的访问方式	全表扫描:Full Table Scans	通过 ROWID 访问表:table access by ROWID	索引范围扫描:INDEX RANGE SCAN	索引唯一性扫描:INDEX UNIQUE SCAN	索引全扫描:INDEX FULL SCAN	索引快速扫描:index fast full scan	索引跳跃式扫描:INDEX SKIP SCAN
  1. Access,表示如何定位到需要的数据,然后取出该结果集,这个定位的条件,会决定访问是走表,还是索引;Filter,表示过滤条件,通过 filter 过滤掉不需要的数据;

  2. 更复杂的查询,会有统计信息 Statistics 的说明;

    在这里插入图片描述

  3. Statistics 中的 recursive calls,表示执行一条 sql 语句时,产生对其他额外 sql 语句的调用,这部分额外 sql 语句,称为 recursive calls,如 insert 操作,如果没有空间保存,就需要额外 sql 语句来释放空间,分配空间;

  4. Statistics 中的 db block gets,表示从高速缓冲区 buffer cache 中,读取的 block 数;

  5. Statistics 中的 consistent gets,表示从 buffer cache 中,读取 undo 数据的 block 数,产生原因是查询时,其他会话在对数据块操作,导致查询时有了修改,所以需要读取修改之前的数据,保证一致性读;

  6. Statistics 中的 physical reads,表示从磁盘读取的 block 数,是由于缓存中不存在要查询的数据,才需要磁盘查询,该值过高,就需要进行优化,增大数据缓冲区大小等措施;

数据缓冲区的使用命中率 = 1 - ( physical reads / (db block gets + consistent gets))
  1. Statistics 中的 redo size,表示 DML 生成的 redo 大小,
// 数据库服务器通过 SQL*Net 向查询客户端发送的查询结果字节数	bytes sent via SQL*Net to client	// 通过 SQL*Net 接受的来自客户端的数据字节数	bytes received via SQL*Net from client	// 服务器和客户端,来回往返通信的 Oracle Net messages 条数	SQL*Net roundtrips to/from client	// 在内存执行的排序量   	sorts (memory)	// 在磁盘上执行的排序量	sorts (disk)	// 处理的数据的行数	rows processed
  1. 更多,参考:https://www.cnblogs.com/xqzt/p/4467867.html;

mysql 的 explain

  1. explain sql 语句,explain extended sql 语句,explain partitions sql 语句,表示多显示一个分区信息,对分区表,有效;

  2. 示例 explain select name from actor group by name,

    在这里插入图片描述

  3. id 列,代表一个查询,id 值越大,执行优先级越高,如果 id 值相同,则从上往下执行,id 为 null,最后执行;

  4. select_type,代表查询类型,有 simple,表示简单查询,primary,表示复杂查询中最外层的 select,subquery,表示包含在 select 中的子查询,不在 from 子句中,derived,代表包含在 from 子句中的子查询;

  5. table,代表要查询的表,partitions,代表使用的分区,非分区表,为 null;

  6. type,代表 mysql 使用何种方式来完成查询,从效率最优到最差,分别为 null > system > const > eq_ref > ref > range > index > ALL,通常保证查询达到 range 级别,最好达到 ref,否则就需要优化;

null:表示不需要索引或表查询,如 select 1+2 		const, system:表示查询条件被优化成一个常量,如 primary key 或 unique key 的列与常数比较时,只需索引比较,		读取 1 次,速度很快,如 explain select * from actor where id = '1';; 		eq_ref:表示 primary key 或 unique key 索引的列被连接使用 ,最多只会返回一条符合条件的记录,			ref:查询时,使用普通索引或者唯一性索引的部分前缀,索引和某个值相比较,可能会找到多个符合条件的行。		如 explain select * from actor where name = 'a'; name 上有普通索引		range:出现在 in(), between ,> ,<, >= 等操作中,使用索引来检索给定范围的行。		如 explain select * from actor where name in ('a');		index:扫描全表索引,这通常比ALL快一些。(index是从索引中读取的,而all是从硬盘中读取)		如 explain select name from actor; name 字段有索引,且不需要回表查询,所以直接索引查询,可以返回		ALL:即全表扫描,意味着 mysql需要对表,从头到尾查找所有需要的行,通常情况下需要增加索引来进行优化		如 explain select * from actor;
  1. possible_keys,代表可能使用的索引列,key,代表实际执行时,mysql 使用的索引,如果没有使用索引,值为 null,使用 force index 或者 ignore index,可以强制 mysql 使用,或忽视 possible_keys 中的索引;

  2. key_len,代表索引中,使用的字节数,char(n) 值为 n,varchar(n) 值为 2 * 字符串长度,如果 utf-8 编码,值为 3n + 2,int 值为 4,timestamp 值为 4,如果允许为 null,需要 1 字节记录是否为 null,且索引最大长度是 768 字节,超过会截断;

  3. ref,代表 key 记录的索引,使用的列或常量,有 const(常量),字段名,下图中,首先对表 a,使用 const 索引查找,然后根据 a.id 对表 f 进行索引查找;

    在这里插入图片描述

  4. rows,代表 mysql 预估需要读取并检查的行数,注意这个不是结果集里的行数;

  5. Extra,代表查询的额外信息,如使用索引情况,是否用到排序,临时表等信息;

null :表示使用到索引,但只通过索引,无法获取查询结果,需要回表 	          	using index :表示只查询索引,可以得到查询结果,且 where 条件只用到索引前导列就可定位到结果            		using where : 表示没有用到索引    		using where using index :表示只查询索引即可,但 where 条件用到索引的非前导列,或者 like 查询       		using index condition :表示使用到索引,但通过索引无法获取查询结果的所有列,需要回表,且与 null 不同的是,使用		索引的范围查找,非等值查找		  				using temporary :查询结果需要创建一张临时表,此时往往需要优化,通过创建索引       		using filesort :涉及排序,但排序字段没有索引,需要先查出排序字段+主键,然后按排序字段排序,再根据主键回表, 				也往往需要优化,创建索引
  1. rows * filtered /100,代表和 explain 中前一个表进行连接的行数,预估值,前一个表指 explain 中的 id 值,比当前表 id值小的表;
你可能感兴趣的文章
蓝桥杯真题 14省1-啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。 我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。 注意:答案是一
查看>>
蓝桥杯 算法训练 - 寂寞的数 道德经曰:一生二,二生三,三生万物。   对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和。例如,d(23)=23+2+3=28, d(1481
查看>>
蓝桥杯 算法训练 - 简单加法(基本型) 首先给出简单加法算式的定义:   如果有一个算式(i)+(i+1)+(i+2),(i>=0),在计算的过程中,没有任何一个数位出现了进位,则称其为简单的加
查看>>
蓝桥杯 算法训练 - 连续正整数的和 78这个数可以表示为连续正整数的和,1+2+3,18+19+20+21,25+26+27。   输入一个正整数 n(<=10000)   输出 m 行(n有m
查看>>
蓝桥杯 算法训练 - 整除问题 编写一个程序,输入三个正整数min、max和factor,然后对于min到max之间的每一个整数(包括min和max),如果它能被factor整除,就把它打印出来。
查看>>
蓝桥杯真题 17省10-k倍区间 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i
查看>>
蓝桥杯真题 17省9-分巧克力 儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形。 为了公平起见,小明
查看>>
蓝桥杯 20模1-4-数字9 在1至2019中,有多少个数的数位中包含数字9? 注意,有的数中的数位中包含多个9,这个数只算一次。例如,1999这个数包含数字9,在计算只是算一个数。
查看>>
蓝桥杯真题 18国1-换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种。 小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱。 小明有点强迫症,
查看>>
蓝桥杯真题 14校3-大小之差
查看>>
蓝桥杯真题 15校1-单词计数 输入一个字符串,求它包含多少个单词。单词间以一个或者多个空格分开。 第一个单词前,最后一个单词后也可能有0到多个空格。 比如:“ abc xyz“ 包含两个单
查看>>
蓝桥杯真题 14省2-切面条 一根高筋拉面,中间切一刀,可以得到2根面条。 如果先对折1次,中间切一刀,可以得到3根面条。 如果连续对折2次,中间切一刀,可以得到5根面条。 那么,连续对折10次,
查看>>
蓝桥杯 算法训练 - 整数平均值
查看>>
蓝桥杯真题 13省2-马虎的算式 小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。 有一次,老师出的题目是:36 x 495 = ? 他却给抄成了:396 x 45 = ? 但结果却
查看>>
蓝桥杯真题 13省3-第39级台阶 小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级! 站在台阶前,他突然又想着一个问题: 如果我每一步只能迈上1个或2个台
查看>>
蓝桥杯真题 15省Ca1-方程整数解 方程: a^2 + b^2 + c^2 = 1000 a2+b2+c2=1000 a^2 + b^2 + c^2 = 1000a2+b2+c2=1000 这个
查看>>
C语言中怎么表示派 -π
查看>>
蓝桥杯 基础训练—闰年判断
查看>>
蓝桥杯 基础训练—十六进制转八进制 输入的第一行为一个正整数n (1<=n<=10)。   接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度
查看>>
蓝桥杯 基础训练—数列排序  给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
查看>>