Explain对select语句的了解

explain是什么?
MySQL8.0文档:explain提供了MySQL执行语句的信息
  • explain可以显示select,insert,update,delete,replace语句的信息

  • explain和可解释性语句执行时,MySQL将显示来自优化器的有关执行语句的优化信息

  • explain与不可解释的语句一起使用时,它将显示在命名连接中执行的语句的执行计划

  • 对于select语句, explain产生可以使用来显示的其他执行计划信息

  • explain对于检查涉及分区表的查询很有用

  • 该FORMAT选项可用于选择输出格式。TRADITIONAL以表格格式显示输出

      我个人关注点是:explain对select语句信息
    

在这里插入图片描述图片可以看到有两张表连接,explain分别给出了两张表执行语句的信息

	这些信息是什么意思呢?
  • id
    这是SELECT查询中的序号
  • select_type
类型解释
SIMPLE简单SELECT(不使用 UNION或子查询)
PRIMARY最外层 SELECT
UNIONSELECT陈述中的第二个或之后的陈述 UNION
DEPENDENT UNIONSELECT第二个或更高版本的SELECT语句 UNION,取决于外部查询
UNION RESULTUNION的结果,union语句中第二个select开始后面所有select
SUBQUERY子查询中的第一个SELECT,结果不依赖于外部查询
DEPENDENT SUBQUERY子查询中的第一个SELECT,结果依赖于外部查询
DERIVED派生表的SELECT, FROM子句的子查询
DEPENDENT DERIVED派生表依赖于另一个表
MATERIALIZED物化子查询
UNCACHEABLE SUBQUERY子查询,其结果无法缓存,必须针对外部查询的每一行重新进行评估
UNCACHEABLE UNIONUNION 属于不可缓存子查询的中的第二个或更高版本的选择
  • table
    输出行所引用的表的名称

  • partitions
    查询将匹配记录的分区,没有表分区则为null

  • type
    type列 explain输出介绍如何联接表,以下从好到差

    • 1:system该表只有一行
    • 2:const该表最多具有一个匹配行,该行在查询开始时读取。因为只有一行,所以优化器的其余部分可以将这一行中列的值视为常量。 const表非常快,因为它们只能读取一次
    • 3:eq_ref对于先前表中的每行组合,从此表中读取一行。除了 system和 const类型,这是最好的联接类型。
    • 4:ref对于先前表中的每个行组合,将从该表中读取具有匹配索引值的所有行
    • 5:fulltext使用FULLTEXT 索引执行联接。
    • 6:ref_or_null这种连接类型类似于 ref,但是除了MySQL会额外搜索包含NULL值的行。此联接类型优化最常用于解析子查询
    • 7:index_merge此联接类型指示使用索引合并优化。
    • 8:unique_subquery此类型替换 以下形式的eq_ref某些 IN子查询value IN (SELECT primary_key FROM single_table WHERE some_expr), unique_subquery 只是一个索引查找函数,它完全替代了子查询以提高效率
    • 9:index_subquery此连接类型类似于 unique_subquery。它代替IN子查询,但适用于以下形式的子查询中的非唯一索引:value IN (SELECT key_column FROM single_table WHERE some_expr)
      -10: range使用索引选择行,仅检索给定范围内的行,range当一个键列使用任何的相比于恒定可使用 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE,或 IN()
    • 11:index该index联接类型是一样的 ALL,只是索引树被扫描
      • 如果索引是查询的覆盖索引,并且可用于满足表中所需的所有数据,则仅扫描索引树。在这种情况下,Extra列显示为 Using index。仅索引扫描通常比索引扫描更快, ALL因为索引的大小通常小于表数据
      • 使用对索引的读取执行全表扫描,以按索引顺序查找数据行。 Uses index没有出现在 Extra列中。
    • 12:ALL对来自先前表的行的每个组合进行全表扫描,如果该表是未标记的第一个表 const,则通常不好,并且在所有其他情况下通常 非常糟糕。通常,可以ALL通过添加索引来避免这种情况,这些 索引允许基于早期表中的常量值或列值从表中检索行。了解更多信息
  • possible_keys

该possible_keys列指示MySQL可以选择从中查找表中各行的索引。请注意,此列完全独立于的输出中显示的表顺序 EXPLAIN。这意味着,某些键possible_keys实际上可能无法用于生成的表顺序。

如果此列是NULL(或在JSON格式的输出中未定义),则没有相关的索引。在这种情况下,您可以通过检查该WHERE 子句以检查它是否引用了某些适合索引的列,从而提高查询性能。如果是这样,请创建一个适当的索引并EXPLAIN再次检查查询 。请参见 第13.1.9节“ ALTER TABLE语句”。

要查看表具有哪些索引,请使用。 SHOW INDEX FROM tbl_name
  • key
该key列指示MySQL实际决定使用的密钥(索引)。如果MySQL决定使用possible_keys 索引之一来查找行,则将该索引列为键值。

可能key会命名该值中不存在的索引 possible_keys。如果没有possible_keys索引适合查找行,但是查询选择的所有列都是其他索引的列,则会发生这种情况。也就是说,命名索引覆盖了选定的列,因此尽管不使用索引来确定要检索的行,但索引扫描比数据行扫描更有效。

对于InnoDB,即使查询还选择了主键,辅助索引也可能覆盖选定的列,因为InnoDB主键值与每个辅助索引一起存储。如果 key为NULL,则MySQL没有找到可用于更有效地执行查询的索引。

要强制MySQL使用或忽略列出的索引 possible_keys列,使用 FORCE INDEX,USE INDEX或IGNORE INDEX在您的查询。请参见第8.9.4节“索引提示”。

对于MyISAM表,运行 ANALYZE TABLE有助于优化器选择更好的索引。对于 MyISAM表,myisamchk --analyze也是如此。请参见 第13.7.3.1节“ ANALYZE TABLE语句”和 第7.6节“ MyISAM表维护和崩溃恢复”。
  • key_len
该key_len列指示MySQL决定使用的密钥的长度。的值 key_len使您能够确定MySQL实际使用的多部分键的多少部分。如果该key列显示 NULL,则该len_len 列也显示NULL。

由于密钥存储格式的原因,可以使用的列的密钥长度NULL 比使用NOT NULL列的密钥长度大一。
  • ref
该ref列显示将哪些列或常量与该key列中命名的索引进行比较,以 从表中选择行。

如果值为func,则使用的值是某些函数的结果。要查看哪个功能,请使用 SHOW WARNINGS以下 EXPLAIN命令查看扩展 EXPLAIN输出。该函数实际上可能是算术运算符之类的运算符。
  • rows
该rows列指示MySQL认为执行查询必须检查的行数。

对于InnoDB表,此数字是估计值,可能并不总是准确的。
  • filtered
该filtered列指示将被表条件过滤的表行的估计百分比。最大值为100,这表示未过滤行。值从100减小表示过滤量增加。 rows显示检查的估计行数,rows× filtered显示将与下表连接的行数。例如,如果 rows为1000且 filtered为50.00(50%),则与下表连接的行数为1000×50%= 500。
  • Extra
此列包含有关MySQL如何解析查询的其他信息

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

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

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

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

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

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

No tables used:Query语句中使用from dual 或不含任何from子句
个人参考:
MySQL8.0文档:https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#explain_possible_keys
大佬博客:https://www.cnblogs.com/tufujie/p/9413852.html
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值