Explain查询SQL分析

Explain的使用

介绍:使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。

使用:explain sql语句
在这里插入图片描述
字段id
在这里插入图片描述
(1 id相同,则执行顺序为table自上而下执行,也就是t1,t2,t3
在这里插入图片描述
(2 id不同,若包含了子查询,则id越大的,越先执行,这条sql中t1为最外面的,而t2,t3都是子查询,子查询的优先级越高。
在这里插入图片描述
(3 id相同不同 ,首先还是按照优先级越高,id越大的越先执行,也就是先查询t3,若有id相同的,则还是按照自上而下查询。
衍生表 = derived2 --> derived + 2 (2 表示由 id =2 的查询衍生出来的表。type 肯定是 all ,因为衍生的表没有建立索引)

字段 select_type
(1 Simple 简单的 select 查询,查询中不包含子查询或UNION
(2 PRIMARY 查询中若包含任何复杂的子部分,最外层查询则被标记为Primary,通常来说就是最后执行的。
(3 DERIVED 在FROM后包含的子查询被标记为DERIVED(衍生)MySQL会递归执行这些子查询, 把结果放在临时表里。
(4 SUBQUERY 在SELECT或WHERE列表中包含了子查询,这个要个from后面的子查询区分开。
(5 DEPENDENT SUBQUERY 在SELECT或WHERE列表中包含了子查询,子查询基于外层。
(6 UNCACHEABLE SUBQUREY 无法被缓存的子查询。
(7 UNION 若第二个SELECT出现在UNION之后,则被标记为UNION。
(8 UNION RESULT 从UNION表获取结果的SELECT。
如下图所示union result就是将a,b两个表合并以后的结果集。
在这里插入图片描述

字段 type
(1 const 表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快
如将主键置于where列表中,MySQL就能将该查询转换为一个常量。
在这里插入图片描述
(2 eq_ref 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。
(3 ref 非唯一性索引扫描,返回匹配某个单独值的所有行.
本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体。
(4 all 遍历全表查询,这种type是效率最慢的。

示例图:
没有索引的情况下就是all
在这里插入图片描述
如果增加一个单值索引就成了ref,ref是匹配多条的,而eq_ref匹配一条。
在这里插入图片描述

(5 range 只检索给定范围的行,使用一个索引来选择行。key 列显示使用了哪个索引一般就是在你的where语句中出现了between、<、>、in等的查询,这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。
在这里插入图片描述
(6 index Full Index Scan,index与ALL区别为index类型只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小。也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘中读的)
在这里插入图片描述
查询效率由慢到快
在这里插入图片描述
字段 possible_keyskeykey_len
possible_keys表示被查询的字段上的设计到的索引,但不一定都被使用,key表示实际使用到的索引,如果为null表示没有使用索引,或者没有索引。查询中若使用了覆盖索引,则该索引仅出现在key列表中,覆盖索引就是查询的字段和select的字段重叠,例如:为deptName和address这两个列建立一个复合索引
在这里插入图片描述
则当仅查询这两个字段的时候就会出现possible_key为null,但key不为null的情况。
在这里插入图片描述
key_len表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,该值越小越好。

字段 ref
显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值,const表示一个常量,也就是a.name = xxx,xxx就是一个具体的常量,a表使用了name=xxx这个常量,baolemo_product.a.deptId表示使用了baolemo_product这个库的a表的deptId字段。
在这里插入图片描述
字段rows
rows列显示MySQL认为它执行查询时必须检查的行数,mysql在执行sql时会估算本条sql会涉及多少行,我们来对比一下有索引和没有索引的情况。
没有索引:rows=7
在这里插入图片描述
有索引:rows=1
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43750656/article/details/106784012