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-扩展. 如果是联合索引,则长度是所有字段长度的总和
- 表示 MySQL 实际使用的索引的长度,该值与索引定义的长度有关,比如索引字段是name varchar(20),并允许为null, 引擎使用utf8mb3, 则长度就是20 * 3 + 2 + 1 = 63个字节, 20 = 字符,20 * 3就是转换成字节,这个2表示是记录字符串的长度占2个字符,1表示记录是否允许为空的标识占1字符,如果该字段不允许为空,则这个1就不需要加了,因为不需要记录是不是null。
类型 | 所占字节数 |
---|---|
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 操作来合并查询结果集,使用了一些优化策略来提高查询效率。 |