文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL EXPLAIN执行计划解析

2022-08-22 12:00

关注

前言

调用EXPLAIN可以获取关于查询执行计划的信息,以及如何解释输出。EXPLAIN命令是查看查询优化器如何决定执行查询的主要方法,但该动能也有局限性,它的选择并不总是最优的,展示的也并不一定是真相。

1 调用EXPLAIN

要使用EXPLAIN,只需要在SELECT 关键字之前增加 EXPLAIN这个词。mysql会在查询上设置一个标记。当执行查询时,这个标记会使其返回关于在执行计划中每一步的信息,而不是真正完全的执行该语句。

它会返回一行或多行信息,显示出执行计划中的每一部分和执行的次序。在查询中,每个表的输出只有一行,若多表关联,则输出多行。别名表单算为一个表,因此如果把表和自己连接,输出中也会有两行。这里的表的定义非常的广:可以是一个子查询,一个 UNION 结果。

EXPLAIN有两个变种:

增加了EXPLAIN之后,MySQL可能仍然会执行部分查询,如果查询中FROM字句中包括子查询,那么MySQL实际会执行子查询的,并将其结果放在一个临时表中,然后完成外层查询优化。

EXPLAIN 返回的只是个近似结果,并且还有相关是的限制:

2 EXPLAIN中的列

2.1 id

一个编号,表示select所属的行。如果查询中没有子查询或关联查询,那么只会有唯一的SELECT,每一行的该列中都将显示一个1,否则,内层的SELECT语句一般会顺序编号,对应于其在原始语句中的位置。id越大执行优先级越高,id相同则认为是一组,从上往下执行,id为NULL最后执行。

例如UNION查询中最后对于临时表的查询,它的id就为null,因为临时表并不在原sql中出现。

EXPLAIN select * from contacts where contact_id <1000
UNION 
select * from contacts where contact_id >99000

MySQL EXPLAIN执行计划解析

2.2 select_type

表示对应行是简单还是复杂的查询。

其他部分标记如下:

除了上面这些,SUBQUERY和UNION还可以被标记为DEPENDENT和UNCACHEABLE,DEPENDENT意味着SELECT 依赖与外层查询中发现的数据;UNCACHEABLE意味着SELECT 中的某些特性阻止结果被缓存于一个 Item_cache 中。

EXPLAIN select * from contacts where contact_id =99000

MySQL EXPLAIN执行计划解析

2.3 table

显示了EXPLAIN对应行正在访问哪个表。通常情况下,它相当表明了:那就是那个表,或者该表的别名。

可以通过该列从上到下观察MySQL的关联优化器为查询选择的关联顺序。

from字句中有子查询的时候,table列是<derivedN>的形式,N指向子查询id,这里N总是指向EXPLAIN输出结果中的后面的一行。

当有UNION时,UNION RESULT的table列包含一个参与UNION的id列表,UNION RESULT总是出现在UNION中所有参与行之后,例如<union 1,2>

2.4 type

关联类型,或者说访问类型,该字段表明MySQL决定如何查找表中的行。

常用的访问类型如下(性能依次从最差到最优):

2.5 possible_keys

显示查询可以使用哪些索引,这是基于查询访问的列和使用的比较操作符来判断的。该列表是在优化过程的早期创建的,因此列出来的索引对于后续实际优化过程可能是没有用的。

2.6 key

显示mysql决定采用哪一个索引来优化对该表的访问,如果该索引没有出现在possible_keys列中,那么MySQL选用它是出于另外的原因——例如,它可能选择了一个覆盖索引,哪怕它没有WHERE字句。

possible_keys表示哪些索引有助于高效查找,而key表示该索引可以最小化查询成本。

如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX

2.7 key_len

MySQL在索引中使用的字节数,通过这个值可以算出具体使用了索引中的哪些列,计算时需要考虑字符集,如果字段允许为 NULL,需要1字节记录是否为 NULL。

key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。

2.8 ref

这一列显示了在key列记录的索引中,表查找值所用到的列或常量,即哪些列或常量被用于查找索引列上的值。常见的有:const(常量),func,NULL,字段名(例:film.id)

2.9 rows

这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数,而是MySQL为了找到符合查询的每一个标准的那些行而必须读取的行的平均数。

有时候该估值可能很不精确,该数字也反映不了LIMIT字句的真正检查行数。

2.10 Extra

这一列展示的是额外信息。常见的重要值如下:

到此这篇关于MySQL EXPLAIN执行计划解析的文章就介绍到这了,更多相关MySQL EXPLAIN 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯