mysql中explain的详细解释

 2024-02-02 01:04:24  阅读 0

在日常工作中,我们有时会运行慢查询来记录一些执行时间较长的SQL语句。 找到这些 SQL 语句并不意味着我们就完成了。 有时我们经常使用该命令来查看其中一条SQL语句。 执行计划,检查SQL语句是否使用索引,是否进行全表扫描。 这可以通过命令来检查。 因此我们深入研究MySQL基于成本的优化器,我们还可以详细了解优化器可能考虑的许多访问策略,以及优化器在运行SQL语句时预计会采用哪些策略。 (QEP:sql生成执行计划查询计划)

删除索引的sql_sql索引删除键没有了_删除索引mysql

出来的信息有10列,分别是id、table、type、key、ref、rows和Extra。 这些字段可能出现的情况解释如下:

1. 身份证号码

我的理解是它标识了SQL执行的顺序。 SQL是按照从大到小的顺序执行的。

1、当ID相同时,执行顺序为从上到下。

2、如果是子查询,id的序号会递增。 id值越大,优先级越高,会最先执行。

3、如果id相同,则可以认为是一组,从上到下依次执行; 所有组中,id值越大,优先级越高,越早执行。

二,

指示查询中每个子句的类型

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

(2)(如果查询包含任何复杂的子部分,则将最外面的子部分标记为)

(3) UNION(UNION 中的第二条或后续语句)

(4) UNION(UNION中的第二条或后续语句,取决于外部查询)

(5)UNION(UNION的结果)

(6)(子查询中的第一个)

(7) (首先在子查询中,取决于外部查询)

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

(9)(子查询的结果无法缓存,必须重新评估外部链接的第一行)

3. 桌子

显示该行数据引用的是哪个表。 有时它不是真正的表名。 你看到的是(x是一个数字,我的理解是哪一步执行的结果)

删除索引的sql_sql索引删除键没有了_删除索引mysql

4. 类型

代表MySQL在表中查找所需行的方式,也称为“访问类型”。

type表示访问类型,是一个比较重要的指标。 结果值从最好到最差是:

ALL:全表扫描,MySQL会遍历整个表来查找匹配的行,效率最低,需要优化。

index:全索引扫描,index与ALL的区别在于索引类型只遍历索引树

range:仅检索给定范围的行,使用索引来选择行

ref:表示上表的连接匹配条件,即使用哪些列或者常量来查找索引列上的值

:与ref类似,不同的是使用的索引是唯一索引。 对于每个索引键值,表中只有一条记录匹配。 简单来说,多表连接中使用key或者key作为关联条件。

const,:这些类型在MySQL优化查询的某些部分并将其转换为常量时使用。如果主键放在where列表中,MySQL可以将查询转换为常量,这是const的一种特殊情况类型。 当查询表只有一行时,使用

NULL:MySQL在优化过程中分解了语句,甚至在执行过程中不需要访问表或索引。 例如,从索引列中选择最小值可以通过单独的索引查找来完成。

五,

指示MySQL可以使用哪个索引来查找表中的记录。 如果查询涉及的字段有索引,则会列出该索引,但查询不一定会使用该索引。

此列完全独立于输出中显示的表的顺序。 这意味着某些键实际上不能按生成的表顺序使用。

如果该列为 NULL,则没有关联的索引。 在这种情况下,您可以通过检查 WHERE 子句来查看它是否引用了某些列或适合建立索引的列,从而提高查询的性能。如果是,请创建适当的索引并使用检查再次查询

6. 按键

键列显示MySQL实际决定使用的键(索引)

如果没有选择索引,则键为 NULL。 要强制 MySQL 使用或忽略列上的索引,请在查询中使用 FORCE INDEX、USE INDEX 或 INDEX。

七,

指示索引中使用的字节数。 通过该列可以计算出查询中使用的索引的长度(显示的值为索引字段可能的最大长度,而不是实际使用的长度,即是根据表定义计算的,而不是通过内检索的表)

在不损失准确性的情况下,长度越短越好

8.参考

表示上表的连接匹配条件,即使用哪些列或者常量来查找索引列上的值

9.行

表示MySQL根据表统计信息和索引选择来估计需要读取的行数以找到所需的记录。

10. 额外

此列包含 MySQL 在以下情况下如何解析查询的详细信息:

using where:从表中返回列数据,仅使用索引中的信息,而不读取实际操作。 当表的所有请求列都属于同一索引时,会发生这种情况,表明 MySQL 服务器将在存储引擎检索到行后进行筛选

using:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询。

使用:MySQL中使用索引无法完成的排序操作称为“文件排序”

using join:改变的值强调获取join条件时不使用索引,需要一个join 来存储中间结果。 如果出现这个值,需要注意的是,根据查询的具体条件,可能需要添加索引来提高性能。

where:该值强调where语句将导致没有匹配的行。

away:该值意味着仅使用索引,优化器可能只从聚合函数结果中返回一行

总结:

• 不告诉您触发器、存储过程或用户定义的函数如何影响查询

• 不考虑各种缓存

• 执行查询时无法显示MySQL 所做的优化工作

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

• 只能解释操作,其他操作必须重写才能稍后查看执行计划。

标签: 索引 查询 语句

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码