MySQL Explain 关键字详解

mysql,explain · 浏览次数 : 0

小编点评

Explain 关键字可以模拟执行 SQL 查询语句,输出执行计划,帮助我们分析查询语句的执行性能。 使用方式如下: explain + sqlexplain select * from t1 执行计划各字段含义如下: 1. id:序号,相同序号的从上往下执行,不同序号的先执行序号大的。 2. select_type:查询类型,包括 SIMPLE、PRIMARY、SUBQUERY、DEPENDENT SUBQUERY、DERIVED、UNION、UNION RESULT、DEPENDENT UNION 等。 3. table:当前行正在访问的表。 4. type:查询使用的类型,性能由好到坏依次是:system > const > eq_ref > ref > range > index > all。 5. possible_keys:显示可能使用到的索引。 6. key:实际使用的索引。 7. key_len:索引使用的字节数。 8. ref:哪些列或常量被用于匹配用到的索引。 9. rows:根据表统计信息及索引选用情况,估算出找到所需的记录所需要读取的行数。 10. filtered:某个表经过条件过滤之后,剩余记录条数的百分比。 11. Extra:包含一些重要的额外信息,如 Using index、Using where、Using filesort、Using temporary 等。 以一个示例进行说明: explain + sqlexplain select * from users where name = "张三" and email = "xxx@qq.com" 执行结果如下: ``` id: 1 select_type: SIMPLE table: users type: ref possible_keys: idx_name_email key: idx_name_email key_len: 50 * 3 + 2 + 1 + 100 * 3 + 2 = 455 ref: const rows: 1 filtered: 100% Extra: Using index condition ``` 根据执行结果,我们可以得知: - 查询类型为 SIMPLE。 - 访问的表为 users。 - 使用了 idx_name_email 索引。 - 查询条件为 name = "张三" 和 email = "xxx@qq.com"。 - 估计需要读取的行数为 1。 - 未使用索引进行查询。 - 查询条件中有一个索引范围查找。 - 查询过程中没有用到临时表。

正文

概述

explain 关键字可以模拟执行 sql 查询语句,输出执行计划,分析查询语句的执行性能

使用方式如下:explain + sql

explain select * from t1

执行计划各字段含义

1. id

  • 如果 id 序号相同,从上往下执行
  • 如果 id 序号不同,序号大先执行
  • 如果两种都存在,先执行序号大,在同级从上往下执行
  • 如果显示 NULL,最后执行,表示结果集,并且不需要使用它来进行查询

2. select_type

表示查询的类型,取值有如下:

SIMPLE:简单的 select 查询,不包含子查询或者 UNION

PRIMARY:复杂查询中最外层查询,比如使用 union 或 union all 时,id 为 1 的记录 select_type 通常是 primary

SUBQUERY:指在 select 语句中出现的子查询语句,结果不依赖于外部查询(不在 from 语句中)

DEPENDENT SUBQUERY:指在 select 语句中出现的查询语句,结果依赖于外部查询

DERIVED:derived 称为派生表,在 FROM 子句的查询语句,表示从外部数据源中推导出来的,而不是从 SELECT 语句中的其他列中选择出来的

UNION:若第二个 SELECT 出现在 UNION 之后,则被标记为 UNION;若 UNION 包含在 FROM 子句的子查询中,那么第一个 SELECT 将被标记为 DERIVED

UNION RESULT:UNION 的结果

DEPENDENT UNION:当 union 作为子查询时,其中第一个 union 为 dependent subquery,第二个 union 为 dependent union

3. table

表示当前行正在访问的表

4. type

表示查询使用的类型,性能由好到坏依次是:system > const > eq_ref > ref > range > index > all,一般来说能达到 range 级别,最好能达到 ref 级别

system:表只有一行(相当于系统表),是 const 类型的特例

const:针对主键或唯一索引的等值查询扫描,只返回一行数据

eq_ref:基于主键或唯一索引连接两个表,对于每个索引键值,只有一条匹配记录,被驱动表的类型为 eq_ref,这种类型只出现在 join

ref:非唯一性索引扫描,返回匹配多个符合条件的行

range:范围扫描,检索指定范围的行,一般出现在 where 语句出现 between、< 、>、in 等的查询

index:只遍历索引树即可找到匹配的数据,比如下例中 user_id 就是 orders 表的索引

all:遍历全表找到匹配的数据

5. possible_keys

显示可能使用到的索引,实际不一定被使用

6. key

实际使用的索引

7. key_len

索引使用的字节数,可通过该列计算查询中使用的索引的长度,主要用于联合索引

比如现有 users 表,执行以下 sql,该表有为 name 和 email 字段设置联合索引 index_name_email

explain select * from users where name = "张三" and email = "xxx@qq.com"

执行结果如下:

users 表结构如下:

name 和 email 字段都为 varchar,一个字符占 3 个字节,所以 key_len = 50 * 3 + 2 + 1 + 100 * 3 + 2 = 455,其中 varchar 需要额外占用 2 个字节,允许 NULL 值额外占用 1 个字节

据此我们可以得知 index_name_email 中的 name 和 email 字段都被使用了

8. ref

表示哪些列或常量被用于匹配用到的索引

9. rows

根据表统计信息及索引选用情况,估算出找到所需的记录所需要读取的行数,值越小越好,它不是结果集中的行数

10. filtered

表示某个表经过条件过滤之后,剩余记录条数的百分比

11. Extra

包含一些重要的额外信息

Using index:出现索引覆盖,即查询和检索条件的列都在使用的索引里面,不需要回表

Using where:不通过索引查询需要的数据

下例中 total_price 字段不存在索引

Using index condition:表示查询列不被索引覆盖,where 条件中是一个索引范围查找,过滤完索引后回表找到所有符合条件的数据行

Using filesort:当查询包含排序操作,又无法利用索引完成排序操作时,数据较少在内存排序,数据较多则在磁盘排序

Using temporary:在做如去重、排序和分组等功能时,如果不能有效利用索引,就需要建立临时表来完成

与MySQL Explain 关键字详解相似的内容:

MySQL Explain 关键字详解

概述 explain 关键字可以模拟执行 sql 查询语句,输出执行计划,分析查询语句的执行性能 使用方式如下:explain + sql explain select * from t1 执行计划各字段含义 1. id 如果 id 序号相同,从上往下执行 如果 id 序号不同,序号大先执行 如果两

[转帖]MySQL索引优化分析之性能分析(Explain执行计划)

一、MySQL常见瓶颈 二、性能分析工具Explain(执行计划 ) 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。查看官网说明: 使用: Explain + SQL语句 作用: 三、各字段解释 3.1、

[转帖]深入理解mysql-第十二章 mysql查询优化-Explain 详解(下)

我们前面两章详解了Explain的各个属性,我们看到的都是mysql已经生成的执行计划,那这个执行计划的是如何生成的?我们能看到一些过程指标数据吗?实际mysql贴心为我们提供了执行计划的各项成本评估指标的以及优化器生成执行计划的整个过程的方法。 一、查看执行计划计算的成本数据 我们上边介绍的EXP

[转帖]深入理解mysql-第十章 mysql查询优化-Explain 详解(上)

目录 一、初识Explain 二、执行计划-table属性 三、执行计划-id属性 四、执行计划-select_type属性 一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采

[转帖]深入理解mysql-第十一章 mysql查询优化-Explain 详解(中)

一、执行计划-type属性 执行计划的一条记录就代表着MySQL对某个表的执行查询时的访问方法,其中的type列就表明了这个访问这个单表的方法具体是什么,比方说下边这个查询: mysql> EXPLAIN SELECT * FROM s1 WHERE key1 = 'a';+ + + + + + +

MySQL 执行计划详解

本文从EXPLAIN分析SQL的执行计划开始,进行示例展示,并对输出结果进行解读,同时总结了EXPLAIN可产生额外的扩展信息以及EXPLAIN的估计查询性能,整篇文章基于MySQL 8.0编写,理论支持MySQL 5.0及更高版本。

MySql中执行计划如何来的——Optimizer Trace

当谈到MySQL的执行计划时,会有很多同学想:“我就觉得使用其他的执行方案比EXPLAIN语句输出的方案强,凭什么优化器做的决定与我得不一样?”。这个问题在MySQL 5.6之前或许自己很难解决,但是现在MySQL5.6及更高的版本中引入了Optimizer Trace。

小白也能懂的Mysql数据库索引详解

一文让你彻底了解:主键索引/二级索引,聚簇索引/非聚簇索引,回表/索引覆盖,索引下推,联合索引/最左联合匹配,前缀索引,explain

小白也能懂的Mysql数据库索引详解

核心概念 主键索引/二级索引 聚簇索引/非聚簇索引 回表/索引覆盖 索引下推 联合索引/最左联合匹配 前缀索引 explain 一、[索引定义] 1.索引定义 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法

高性能MySQL实战(三):性能优化 | 京东物流技术团队

这篇主要介绍对慢 SQL 优化的一些手段,而在讲解具体的优化措施之前,我想先对 EXPLAIN 进行介绍,它是我们在分析查询时必要的操作,理解了它输出结果的内容更有利于我们优化 SQL。为了方便大家的阅读,在下文中规定类似 key1 的表示二级索引,key_part1 表示联合索引的第一部分,uni