【HBZ分享】Mysql的Explain的各字段含义

Explain各个字段的含义

在这里插入图片描述

  1. id
    • 对于 SELECT 语句,每个查询都会被分配一个唯一的ID
    • 表示查询的标识符,数字越大越先执行
  2. 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 在创建结果集时使用临时表来存储数据。
  1. table
    • 表示查询涉及到哪些表,对于子查询等复杂查询可能涉及多张表
  2. partitions
    • 表示查询操作涉及到的分区表的分区情况
  3. 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_refeq_ref 与 ref对比结果集只有一个,使用主键或者唯一索引进行查找,不用扫描更多行, 即只会返回一条数据
const最多只有一条匹配行,查询非常迅速,用到primary key 或者unique key,性能最高
system表只有一行,基本不会出现,忽略
null不访问数据库表,直接返回索引
  1. possible_key:
    • 表示 MySQL 可以使用哪些索引来优化查询,就是会把该表创建的索引都展示出来
  2. key(重点)
    • 表示 MySQL 实际真正使用的索引,一定包含在possible_key中,如果没有使用任何索引,则该值为 NULL
  3. 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个
tinyint1字节
int4字节
bigInt8字节
date3字节
dateTime8字节
timeStamp4字节
  1. ref
    • 表示 MySQL 使用哪个列或常量与索引列进行比较
  2. row(重点)
    • 表示 MySQL 估计要扫描多少行才能找到所需记录,是一个估算值而不是确切值,就是查询了多少行数据才找的记录,越大越慢
  3. filtered(重点)
    • 查询条件过滤的效率,百分比形式表示, Filtered 越高,表示查询结果集中过滤数据所需要的开销越小,查询性能就越好, 就是越大越好
  4. 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 操作来合并查询结果集,使用了一些优化策略来提高查询效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值