我们已经准备好了,你呢?

2024我们与您携手共赢,为您的企业形象保驾护航!

在日常工作中我们有时候会开启慢查询来记录一些执行时间很长的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 在执行查询时所做的优化工作

• 一些统计数据是估计值,而不是确切值

• 仅可解释操作,其他操作需重写才能稍后查看执行计划。

收集统计数据不可能得到结果

二维码
扫一扫在手机端查看

本文链接:https://by928.com/6416.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线