MySQL 5.7Explain执行计划


小编给大家分享一下MySQL 5.7Explain执行计划,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!目录1. 介绍2. Explain 结果列详解
2.1 id2.2 select_type2.3 table2.4 partitions2.5 type(非常重要)2.6 possible_keys2.7 key2.8 key_len2.9 ref3.10 rows2.11 filtered2.12 Extra【注】当前系统环境: MySQL 5.7,其他版本略有不同,后期会抽时间单独说明。只介绍常见的场景,其他少见的场景暂不研究,如有需要可以去官方文档中查找。非入门,需要对 MySQL 的底层数据结构 B+ 树有一定的了解。文档参考:
MySQL 官方 Explain 文档1. 介绍使用 EXPLAIN 关键字可以模拟优化器执行 SQL 语句,并分析查询语句的性能瓶颈。2. Explain 结果列详解2.1 idid 列的编号是 select 的序列号,一般有几个 select 就有几个 id(联表查询会有重复的 id),并且 id 的顺序是按 select 出现的顺序增长的。id 越大则表示执行的优先级越高,id 相同(一般出现在联表查询)则从上往下执行,idNULL 最后执行。2.2 select_typeselect_type 表示对应行是简单的还是复杂的查询。常见的值有:simple:简单查询,查询不包含子查询和union。primary:复杂查询中最外层的 select 。subquery:包含在 select 中的子查询(不在 from 子句中)derived:包含在 form 子句中的子查询,MySQL 会将结果放在一个临时表中,也称为派生表。union:在 union 中的第二个或之后的 select。【注】在 MySQL 5.7 中,会对衍生表进行合并优化,如果要直观的查看 select_type 的值,需要临时关闭该功能(默认是打开的),下面的介绍中凡是涉及到衍生表的都需要该操作2.3 table对应行查询的表。【注】当 from 子句中有子查询时,table 列为是 的格式,表示这一行的执行的是 id = N 行的查询。当有 union 时,table 的数据 的格式,M 和 N 表示参与 unionselectid2.4 partitions未完待续。。。2.5 type(非常重要)type 表示这行查询的关联类型(访问类型,或查询类型),通过该值可以了解该行查询数据记录的大概范围。常见的值依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL;一般我们要保证效率的话,要优化我们的语句至少使其达到 range 级别,如果可能的话做好优化到 refrange 一般用于范围查找,所以换句话说除了范围查找,其他的查询语句我们最好是优化到 ref 级别。常见值说明NULL : 表示 MySQL 能够在优化阶段分解查询语句,在执行阶段不用访问表和索引。system / const: MySQL 能对某个查询部分进行优化并将其转化成一个常量(可以通过 show warnings 查看优化的结果),主要是查询主键(Primary Key)或唯一键索引(Unique Key)对应的记录,因为不存在重复,所以最多只能查询出一条记录,所以速度比较快。systemconst 的特例,当临时表里只有一条记录时为 systemreq_ref:当主键或唯一键索引的相关列并联接使用时(联表查询),最多匹配一条符合条件的记录。这是除了 const之外的最好的联接类型,简单的 select 查询不会出现 req_ref,更多出现在联表查询。【注】在查询的过程中的返回结果如下:

当联接表查询时候会看作是一条查询 SQL,所以它们对应的 id 是一样的,当 id 都是一样的时候,按照从上到下的顺序依次执行,这里是先查询班级所有的学生(全表查询 ALL),然后根据学生id查找出学生对应的班级信息(req_ref)。ref:当使用普通索引(Normal)或者是联合索引的部分前缀时,索引要和某个值进行比较,可能会找到多个符合条件的记录行,从辅助索引的根节点开始对比并找到相应的记录。range:范围扫描,通常出现在 in,between,>,= 等操作中,使用一个索引来检索给定范围的行。index覆盖索引定义:覆盖索引一般针对于辅助索引,并不是真正的索引,只是索引查找的一种方式。如果 select 查询的字段都在辅助索引树中全部拿到,这种情况一般是使用了覆盖索引,不需要通过辅助索引树找到主键,再通过主键主键索引树里获取其它字段值。扫描全索引就能拿到结果,一般是扫描某个二级索引辅助索引,除了主键之外的索引)。这种索引不会从主键索引树根节点开始查找,而是直接对二级索引的叶子节点遍历和扫描,从而查找出相应的记录行,速度比较慢;这种查询方式一般为使用覆盖索引,查询所需的所有结果集在二级索引主键索引中都有的情况下,由于二级索引一般比较小(因为二级索引非聚集的,其叶子节点是存放的主键索引相应的地址,而主键索引是聚集的,其叶子节点存放的是完整的数据集),所以优先走二级索引,这种情况通常比 ALL 快一些。在某些情况下,如果表的列数特别多,这个时候通过辅助索引查询的性能就不如直接使用主键索引效率高(如果查询了辅助索引的话,还会返回到主键索引中进行查找更多的字段,也就是回表查询,当然在某些情况下使用回表查询的性能也会比只使用主键索引的性能高),这个时候会走主键索引,这种情况也比 ALL 快。ALL:全表扫描,扫描主键(聚簇、聚集)索引树的所有叶子节点,通常这种情况下要根据业务场景来增加其他索引进行优化。2.6 possible_keyspossible_keys 主要显示查询可能用到哪些索引来查找,只是可能会使用,并不代表一定会使用。常见值说明:NULL: 没有相关索引,如果是 NULL 的话,可以考虑在 where 子句中创建一个适当的索引来提高查询性能,然后继续用 explain 查看其效果;也有可能出现 possible_keysNULL,但是 key 有值,实际走了索引。有列值:如果显示表中的某列,则表示可能会走这一列对应列值的索引;如果 possible_keys 有值,但是 key 显示 NULL这种情况一般存在于表中数据量不大的情况,因为 MySQL 语句优化器认为索引对此查询的帮助不大,从而选择了全表查询2.7 keykey 表示 MySQL 实际采用哪个索引来优开发云主机域名化对该表的查询。如果没有使用索引,则该列为 NULL,如果想强制 MySQL 使用或忽略 possible_keys 列中的索引,可以在查询中使用 force indexignore index.2.8 key_len显示了 MySQL 索引所使用的字节数,通过这个数值可以计算具体使用了索引中的哪些列(主要用于联合索引的优化)。【注】索引最大长度是 768 字节当字符串过长时MySQL 会做一个类似左前缀索引的处理,将前半部分的字符提取出来做索引。示例:一个学生与班级的关系表:banji_student,存在使用 banji_idstudent_id 两个列组合的联合索引,并且每个索引 int 都是 4 字节,通过 key_len 值为 4 可以知道只使用了联合索引的第一列:banji_id 来执行索引查找。key_len 的计算规则如下:字符串:常见的是 char(n)varchar(n),从 MySQL 5.0.3 之后,n 均表示字符数,而不是字节数,如果是 UTF-8,一个数字或字母占1个字节,一个汉字占3个字节。数值类型时间类型NULL如果字段允许设置为 NULL,则需要 1 字节来记录是否为 NULLNot NULL 的列则不需要。2.9 ref显示了在使用 key 列中实际的索引时,表查找时所用到的列名和常量;常见的为 const 常量或索引关联查询的字段(列)名3.10 rows显示预计查询的结果数,并不是真正的结果集中的记录(行)数,仅供参考。2.11 filtered未完待续。。。2.12 Extra这一列展示的是额外的信息,存在很多值,且在不同的场景下以及不同版本的 MySQL 所表示的意思也不同,只能是表示大概的意思并且仅做优化参考,这里只介绍常见的值。Using index:使用覆盖索引,在 type 相同的情况下, Extra 的值为 Using index 要比为 NULL 性能高。比如 banji 表,存在 id,name,create_time 列,存在 id 主键name 普通索引Using where:使用 where 关键字来查询,并且对应的列没有设置索引,对应的 keyNULL。这种情况一般要对查询的列添加相对应的索引来进行优化。Using index condition:非覆盖索引查询并进行了回表,并且辅助索引使用了条件查询语句(where 或其他)。比如 banji_student 关系表,存在 id,banji_id,student_id,create_time 列,存在 id 主键banji_id 与 student_id 的组合(联合)索引Using temporaryMySQL 需要创建创建一个临时表来处理查询,出现这种情况一般要添加索引进行优化处理。Using filesort:使用外部排序而不是索引排序,当数据较小的时候采用的是内存排序,当数据量较大的时候会频繁的访问磁盘,并将排序后的数据写入磁盘。Select tables optimized away:使用聚合函数(例如 maxmin等)来访问存在索引的字段时,只访问索引树中已排好序的叶子,节点性能很高。以上是“MySQL 5.7Explain执行计划”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注开发云行业资讯频道!

相关推荐: MySQL实现单表查询的简单方法

本文主要给大家简单讲讲MySQL实现单表查询的简单方法,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里开发云主机域名就不涉猎了,我们就直奔主题吧,希望MySQL实现单表查询的简单方法这篇文章可以给大家带来一些实际帮助。 首先我们来创建表、插入数据…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 06/12 20:57
下一篇 06/12 20:57

相关推荐