在日常工作中我们有时候会开启慢查询来记录一些执行时间很长的SQL语句。找到这些SQL语句并不代表工作就完成了,有时候我们经常会用这个命令来查看这些SQL语句的执行计划,看看这些SQL语句是否使用了索引,是否做了全表扫描,这些都可以通过命令来查看。这样我们就对MySQL基于成本的优化器有了很深的理解,同时也能得到很多关于优化器可能考虑的访问策略的细节,以及在运行SQL语句的时候预计优化器会采用哪种策略。
--实际 SQL,查找具有用户名的员工
* from emp where name = '';--检查SQL是否使用索引,在前面添加即可
* 来自 emp,其中 name = '';
信息输出一共有10列,分别是id、table、type、key、ref、rows、Extra
摘要描述:
id:选择一个标识符
:表示查询的类型。
table:输出结果集的表
:匹配分区
type:表示表的连接类型
:表示查询时可能用到的索引
key:表示实际使用的索引
:索引字段的长度
ref:列和索引的比较
rows:扫描的行数(估计的行数)
:按表条件过滤的行百分比
附加:执行的描述和解释
以下是对这些字段可能出现的解释:
1. 身份证
标识符。这是查询序列号
我的理解就是SQL的执行顺序,SQL是从大到小执行的。
1.当id相同时,执行顺序是从上到下
2、如果是子查询,ID号会增加,ID值越大,优先级越高,越早执行。
3、如果id相同,则可以认为是一组,从上到下依次执行;所有组中,id值越大,优先级越高,越早执行。
--查看研发部名字以Jef开头的员工,经典查询
e.no, e.name from emp e left join dept d on e.=d.no where e.name like 'Jef%' and d.name = '研发部';
二,
指示查询中每个子句的类型
(1)(简单,不使用UNION或子查询等)
(2)(子查询中最外层查询。如果查询包含任何复杂的子部分,则最外层查询标记为)
(3)UNION(UNION中第二条或后续语句)
(4)UNION(UNION 中的第二条或后续语句依赖于外部查询)
(5)UNION(UNION的结果,union语句中从第二个开始的所有数字)
(6)(子查询中的第一个,结果不依赖于外部查询)
(7)(第一个子查询,依赖于外部查询)
(8)(派生表,FROM 子句中的子查询)
(9)(子查询的结果不能被缓存,外连接的第一行必须重新评估)
3. 表格
显示此步骤访问的数据库中的表名(显示此行数据是关于哪个表的)。有时它不是真正的表名,而可能是缩写,例如上面的 e 和 d,也可能是该步骤执行结果的缩写
类型
表访问方法指示MySQL如何在表中找到所需的行,也称为“访问类型”。
常见类型有:ALL,index,range,ref,const,NULL(从左到右,性能从差到好)
ALL:全表扫描,MySQL 将遍历整个表来查找匹配的行
index:全索引扫描。index和ALL的区别是索引类型只遍历索引树。
范围:仅检索给定范围内的行,使用索引来选择行
ref:表示上表的join匹配条件,即通过哪些列或者常量来查找索引列上的值
:和ref类似,区别在于使用的索引为唯一索引,对于每一个索引键值,在表中都仅有一条记录匹配,简单来说就是在多表连接时,以key或者key作为连接条件
const,:当 MySQL 优化查询的一部分并将其转换为常量时,使用这些访问类型。如果将主键放在 where 列表中,MySQL 可以将查询转换为常量,这是 const 类型的特殊情况。当查询表只有一行时,使用
NULL:MySQL 在优化时分解语句,甚至在执行期间不访问表或索引。例如,从索引列中选择最小值可以通过单个索引查找完成。
五,
表示MySQL可以使用哪个索引来查找表中的记录。如果查询涉及的字段上有索引,则会列出该索引,但可能不被查询使用(查询可以使用的索引,如果没有索引则显示为null)
此列与输出中显示的表的顺序完全无关。这意味着 中的某些键实际上无法在生成的表顺序中使用。
如果列为 NULL,则没有相关索引。在这种情况下,您可以通过检查 WHERE 子句来查看它是否引用了适合索引的某些列或多列,从而提高查询性能。如果是,请创建适当的索引并再次检查查询。
6. 钥匙
key 列显示 MySQL 实际决定使用的键(索引),必须包含在
如果未选择索引,则键为 NULL。要强制 MySQL 使用或忽略列上的索引,请在查询中使用 FORCE INDEX、USE INDEX 或 INDEX。
七,
表示索引中使用的字节数。此列可用于计算查询中使用的索引的长度(显示的值是索引字段的最大可能长度,而不是实际使用的长度,即它是基于表定义计算的,而不是从表中检索的)
在不损失准确性的情况下,长度越短越好。
8. 参考
列与索引的对比,表明上述表的连接匹配条件,即通过哪些列或者常量来查找索引列上的值
9. 行
估计结果集行数,这意味着MySQL根据表统计信息和索引选择来估计找到所需记录所需的行数。
10. 额外
此列包含有关 MySQL 如何解决查询的详细信息。有以下几种情况:
使用 where:您无需读取表中的所有信息,只需通过索引即可获取所需的数据。当表的所有请求列都属于同一索引时,就会发生这种情况,这意味着 MySQL 服务器将在存储引擎检索行后进行筛选。
using:表示mysql需要使用临时表来存储结果集,常见于排序、分组查询,以及常见的group by;order by
使用:当查询包含order by操作,且排序操作无法使用索引完成时,称为“文件排序”
--额外测试
* 从 emp 按名称排序;
使用 join:该值强调在获取 join 条件时不使用索引,需要 join 来存储中间结果。如果出现该值,您应该注意,根据查询的具体情况,可能需要添加索引来提高性能。
where:此值强调 where 子句将不会产生符合条件的行(通过收集统计信息不可能得到结果)。
away:该值表示优化器单独使用索引可能只从聚合函数结果中返回一行。
未使用:查询语句使用 from dual 或不包含任何 from 子句
-- 现在()来自双重;
摘要:• 没有告诉您有关触发器、存储过程或用户定义函数如何影响您的查询
• 没有考虑各种缓存
• 它没有显示 MySQL 在执行查询时所做的优化工作
• 一些统计数据是估计值,而不是确切值
• 仅可解释操作,其他操作需重写才能稍后查看执行计划。
收集统计数据不可能得到结果
扫一扫在手机端查看
-
Tags : mysql explain 分区
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。