【HBZ分享】Mysql的Explain的各字段含义
Explain各个字段的含义
id
对于 SELECT 语句,每个查询都会被分配一个唯一的ID 表示查询的标识符,数字越大越先执行 select_type
表示查询类型或者子查询类型,使用不同的 select_type 来帮助评估查询性能,并确定可以采取哪些优化方法 需要根据具体情况来进行相应的优化,例如尽量减少子查询的数量,避免使用不必要的 UNION 操作等等
类型 概述 SIMPLE(常见) 表示简单的 SELECT 查询,不包含子查询或 UNION 操作。 PRIMAR(常见) 表示外层查询的第一个 SELECT。 UNION 表示 UNION 操作的第二个或后续的 SELECT 查询。 SUBQUERY 表示一个子查询,MySQL 会在子查询中先执行查询,比如where里面包括了子查询。 DEPENDENT SUBQUERY 也表示一个子查询,但是外部 SQL 查询的结果会影响子查询的执行。 DERIVED 表示派生表,MySQL 会在查询中创建一个新的临时表,这个临时表来自于 FROM 子句中的子查询。 UNION RESULT 表示 UNION 操作的结果,MySQL 在创建结果集时使用临时表来存储数据。
table
表示查询涉及到哪些表,对于子查询等复杂查询可能涉及多张表 partitions
type(重点)
表示 MySQL 在表中找到所需行的方式,常见的类型包括 ALL, index,range, ref, eq_ref, const, system, NULL, 性能逐渐变好
Type 描述 all 全表扫描,MYSQL扫描全表来找到匹配的行 index 索引全扫描,MYSQL遍历整个索引来查找匹配的行;Extra 字段里面 出现 Using index,则是覆盖索引,不用二次回表查询 (别混淆了,扫描全索引和扫描全表不一样,索引更快一些,并且就相当于一个字段) range 索引范围扫描,常见于<、<=、>、>=、between、in等操作符;相对于index的全索引扫描,它有范围限制,因此要优于index ref(尽量达到ref级别以上) 使用非唯一性索引或者唯一索引的前缀扫描,返回匹配某个单独值的记录行; 虽使用了索引但该索引列的值并不唯一,进行目标值附近的小范围扫描,不扫描全表 ,就是会查出来多行,并且查询次数就是在这些行数上下,不会走全表 eq_ref eq_ref 与 ref对比结果集只有一个,使用主键或者唯一索引进行查找,不用扫描更多行, 即只会返回一条数据 const 最多只有一条匹配行,查询非常迅速,用到primary key 或者unique key,性能最高 system 表只有一行,基本不会出现,忽略 null 不访问数据库表,直接返回索引
possible_key:
表示 MySQL 可以使用哪些索引来优化查询,就是会把该表创建的索引都展示出来 key(重点)
表示 MySQL 实际真正使用的索引,一定包含在possible_key中,如果没有使用任何索引,则该值为 NULL key_len(重点)
表示 MySQL 实际使用的索引的长度,该值与索引定义的长度有关,比如索引字段是name varchar(20),并允许为null, 引擎使用utf8mb3, 则长度就是20 * 3 + 2 + 1 = 63个字节, 20 = 字符,20 * 3就是转换成字节,这个2表示是记录字符串的长度占2个字符,1表示记录是否允许为空的标识占1字符,如果该字段不允许为空,则这个1就不需要加了,因为不需要记录是不是null。 8-扩展. 如果是联合索引,则长度是所有字段长度的总和
类型 所占字节数 char(n) n字节 varchar(n) 3n +2 , 这个2是保存字符串长度所需要的字节数是2个 tinyint 1字节 int 4字节 bigInt 8字节 date 3字节 dateTime 8字节 timeStamp 4字节
ref
表示 MySQL 使用哪个列或常量与索引列进行比较 row(重点)
表示 MySQL 估计要扫描多少行才能找到所需记录,是一个估算值而不是确切值,就是查询了多少行数据才找的记录,越大越慢 filtered(重点)
查询条件过滤的效率,百分比形式表示, Filtered 越高,表示查询结果集中过滤数据所需要的开销越小,查询性能就越好, 就是越大越好 Extra
该字段包括一些额外的查询信息,包括使用何种排序方式、使用哪种 Join 操作等
类型1 概述 Using index(常见) 选择使用了覆盖索引的特性,通过索引直接获取查询结果,而无需回表查询,提高了查询效率。 Using filesort(常见) 需要额外进行 一个文件排序操作来实现 ORDER BY 操作,可能会严重影响查询性能。 Using temporary (常见) 在执行查询时需要借助临时表来保存中间结果集,这常发生在排序、分组、子查询和 UNION 查询之中。 Using where(常见) 条件查询,在查询过程中需要进行表级别的条件过滤,即使共享了某些索引,也需要进行全表扫描查找符合条件的行。不是仅仅通过索引就可以获取所有需要的数据,则会出现 Using where Range checked for each record 通过索引比较操作来过滤部分行,直到找到符合条件的行,这种操作常出现在使用 INDEX 和 ORDER BY 操作时。 Using join buffer (Block Nested Loop) 在执行连接操作时需要额外申请 join buffer 来存储中间结果,这种操作常发生在连接操作中。 Using index condition 利用了查找索引数据的过程中额外发现的过滤条件进行了优化,无需回表查询或查表,可以直接通过索引结果来返回查询的结果 Using sort_union()和 Using union() 通过 UNION ALL 或 UNION DISTINCT 操作来合并查询结果集,使用了一些优化策略来提高查询效率。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2039346.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!