MySQL—— MySQL的执行计划详解(Explain)

MySQL进阶系列: 一文详解explain各字段含义 explain有何用处呢:为了知道优化SQL语句的执行,需要查看SQL语句的具体执行过程,以加快SQL语句的执行效率。 可以使用explain+SQL语句来模拟优化器执行SQL查询语句,从而知道mysql是如何处理sql语句的。通过查看执行计划了解执行器是否按照我们想的那样处理SQLexplain执行计划中包含的信息如下: id: 查询序列号 select_type: 查询类型 table: 表名或者别名 partitions: 匹配的分区 type: 访问类型 possible_keys: 可能用到 阅读详情

文章目录

 

1、MySQL执行计划的定义

在 MySQL 中可以通过 explain 关键字模拟优化器执行 SQL语句,从而知道 MySQL 是如何处理 SQL 语句的。

2、MySQL整个查询的过程

• 客户端向 MySQL 服务器发送一条查询请求
• 服务器首先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段
• 服务器进行 SQL 解析、预处理、再由优化器生成对应的执行计划
• MySQL 根据执行计划,调用存储引擎的 API 来执行查询
• 将结果返回给客户端,同时缓存查询结果
注意:只有在8.0之前才有查询缓存,8.0之后查询缓存被去掉了

3、如何启动执行计划

explain select 投影列 FROM 表名 WHERE 条件
  • 1

4、Explain分析示例

CREATE TABLE `actor` (
  `id` int(11) NOT NULL,
  `name` varchar(45) DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `film` (
  `id` int(11) NOT NULL,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `film_actor` (
  `id` int(11) NOT NULL,
  `film_id` int(11) NOT NULL,
  `actor_id` int(11) NOT NULL,
  `remark` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_film_actor_id` (`film_id`,`actor_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
EXPLAIN select * from actor;
  • 1

在这里插入图片描述
注意:如果有join连接查询,会输出两行

4、explain的 两个变种(我的版本是5.7)

  1. explain extended:会在 explain 的基础上额外提供一些查询优化的信息。紧随其后通过 show warnings 命令可以得到优化后的查询语句,从而看出优化器优化了什么。额外还有 filtered 列,是一个半分比的值,rows *filtered/100 可以估算出将要和 explain 中前一个表进行连接的行数(前一个表指 explain 中的id值比当前表id值小的表)。
EXPLAIN EXTENDED select * from actor where id=1;
show WARNINGS;
  • 1
  • 2

在这里插入图片描述

  1. explain partitions:相比 explain 多了个 partitions 字段,如果查询是基于分区表的话,会显示查询将访问的分区。

5、explain中的列

5.1、id

查询执行顺序:
id 值相同时表示从上向下执行
id 值相同被视为一组
如果是子查询,id 值会递增,id 值越高,优先级越高
id为NULL最后执行。

5.2、select_type

  1. simple:表示查询中不包含子查询或者 union
    EXPLAIN select * from actor where id=1;
    在这里插入图片描述
  2. primary:当查询中包含任何复杂的子部分,最外层的查询被标记成 primary
  3. derived:在 from 的列表中包含的子查询被标记成 derived
  4. subquery:在 select 或 where 列表中包含了子查询,则子查询被标记成 subquery
    用个例子来了解primary、subquery和derived
    set session optimizer_switch='derived_merge=off';#关闭mysql5.7新特性对衍生表的合并优化
    explain select (select 1 from actor where id = 1) from (select * from film where id = 1) der;
    在这里插入图片描述
    set session optimizer_switch='derived_merge=on'; #还原默认配置
  5. union:两个 select 查询时前一个标记为 PRIMARY,后一个标记为 UNION。union 出现在 from 从句子查询中,外层 select 标记为 PIRMARY,union 中第一个查询为 DERIVED,第二个子查询标记为 UNION
    explain select 1 union all select 1;
    在这里插入图片描述
  6. unionresult:从 union 表获取结果的 select 被标记成 union result 。

5.3、table

显示这一行的数据是关于哪张表的。
当 from 子句中有子查询时,table列是 格式,表示当前查询依赖 id=N 的查询,于是先执行 id=N 的查询。
当有 union 时,UNION RESULT 的 table 列的值为<union1,2>,1和2表示参与 union 的 select 行id。

5.4、type

这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为 system > const > eq_reg > ref > range > index > ALL。
一般来说,得保证查询达到range级别,最好达到ref

  • NULL:mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。例如:在索引列中选取最小值,可以单独查找索引来完成,不需要在执行时访问表
    explain select min(id) from film;
    在这里插入图片描述
  • system:表中只有一行数据。属于 const 的特例。如果物理表中就一行数据为 ALL
  • const :查询结果最多有一个匹配行。因为只有一行,所以可以被视为常量。const 查询速度非常快,因为只读一次。一般情况下把主键或唯一索引作为唯一条件的查询都是 const
    explain select * from (select * from film where id = 1) tmp;
    在这里插入图片描述
  • eq_ref:查询时查询外键表全部数据。且只能查询主键列或关联列。且外键表中外键列中数据不能有重复数据,且这些数据都必须在主键表中有对应数据(主键表中数据可以有没有用到的)
    explain select * from film_actor left join film on film_actor.film_id = film.id
    在这里插入图片描述
  • ref:比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。
  1. 简单 select 查询,name是普通索引(非唯一索引)
    explain select * from film where name = 'film1';
    在这里插入图片描述
  2. 关联表查询,idx_film_actor_id是film_id和actor_id的联合索引,这里使用到了film_actor的左边前缀film_id部分
    explain select film_id from film left join film_actor on film.id = film_actor.film_id;
    在这里插入图片描述
  • range:把这个列当作条件只检索其中一个范围。常见 where 从句中出现 between、<、>、>=、in 等。主要应用在具有索引的列中
    explain select * from actor where id > 1;
    在这里插入图片描述
  • index:扫描全索引就能拿到结果,一般是扫描某个二级索引,这种扫描不会从索引树根节点开始快速查找,而是直接对二级索引的叶子节点遍历和扫描,速度还是比较慢的,这种查询一般为使用覆盖索引,二级索引一般比较小,所以这种通常比ALL快一些
    explain select * from film;
    在这里插入图片描述
  • ALL:即全表扫描,扫描你的聚簇索引的所有叶子节点。通常情况下这需要增加索引来进行优化了。
    explain select * from actor;
    在这里插入图片描述

5.5、possible_keys

  1. 查询条件字段涉及到的索引,可能没有使用。
  2. explain 时可能出现 possible_keys 有列,而 key 显示 NULL 的情况,这种情况是因为表中数据不多,mysql认为索引对此查询帮助不大,选择了全表查询。
  3. 如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查 where 子句看是否可以创造一个适当的索引来提高查询性能,然后用 explain 查看效果

5.6、key

实际使用的索引。如果为 NULL,则没有使用索引。
如果想强制mysql使用或忽视possible_keys列中的索引,在查询中使用 forceindex、ignore index。

5.7、key_len

表示索引中使用的字节数,查询中使用的索引的长度(最大可能长度),并非实际使用长度,理论上长度越短越好。key_len 是根据表定义计算而得的,不是通过表内检索出的。
举个例子来说:
film_actor的联合索引 idx_film_actor_id 由 film_id 和 actor_id 两个int列组成,并且每个int是4字节。通过结果中的key_len=4可推断出查询使用了第一个列:film_id列来执行索引查找。
explain select * from film_actor where film_id = 2;
在这里插入图片描述
在这里插入图片描述

5.8、ref

显示索引的哪一列被使用了,如果可能的话,是一个常量 const。

5.9、rows

根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。注意这个不是结果集里的行数。

5.10、fitered

显示了通过条件过滤出的行数的百分比估计值。

5.11、Extra

MYSQL 如何解析查询的额外信息。

  1. Distinct:MySQL 发现第 1 个匹配行后,停止为当前的行组合搜索更多的行。
  2. Not exists:MySQL 能够对查询进行 LEFT JOIN 优化,发现 1 个匹配 LEFT JOIN 标准的行后,不再为前面的的行组合在该表内检查更多的行。
  3. range checked for each record (index map: #):MySQL 没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。
  4. Using filesort:MySQL 需要额外的一次传递,以找出如何按排序顺序检索行。将用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序。这种情况下一般也是要考虑使用索引来优化的。
    4.1. actor.name未创建索引,会浏览actor整个表,保存排序关键字name和对应的id,然后排序name并检索行记录
    explain select * from actor order by name;
    在这里插入图片描述
    4.2. film.name建立了idx_name索引,此时查询时extra是using index
    explain select * from film order by name;
    在这里插入图片描述
  5. Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。(使用覆盖索引)
    5.1、覆盖索引定义:mysql执行计划explain结果里的key有使用索引,如果select后面查询的字段都可以从这个索引的树中获取,这种情况一般可以说是用到了覆盖索引,extra里一般都有using index;覆盖索引一般针对的是辅助索引,整个查询结果只通过辅助索引就能拿到结果,不需要通过辅助索引树找到主键,再通过主键去主键索引树里获取其它字段值
    explain select film_id from film_actor where film_id = 1;
    在这里插入图片描述
  6. Using temporary:为了解决查询,MySQL 需要创建一个临时表来容纳结果。
    6.1. actor.name没有索引,此时创建了张临时表来distinct
    explain select distinct name from actor;
    在这里插入图片描述
    6.2. film.name建立了idx_name索引,此时查询时extra是using index,没有用临时表
    explain select distinct name from film;
    在这里插入图片描述
  7. Using where:WHERE 子句用于限制哪一个行匹配下一个表或发送到客户,并且查询的列未被索引覆盖
    explain select * from actor where name = 'a';
    在这里插入图片描述
  8. Using sort_union(…), Using union(…), Using intersect(…): 这 些 函 数 说 明 如 何 为index_merge 联接类型合并索引扫描。
  9. Using index for group-by:类似于访问表的 Using index 方式,Using index for group-by 表示MySQL发现了一个索引,可以用来查 询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。
10 分钟教会你如何看懂 MySQL 执行计划 通常查询慢查询SQL语句时会使用EXPLAIN命令来查看SQL语句的执行计划,通过返回的信息,可以了解到Mysql优化器是如何执行SQL语句,通过分析可以帮助我们提供优化的思路。 阅读详情

相关推荐

MYSQL EXPLAIN执行计划详解

mysql查询优化器在基于成本和规则对一条查询语句进行优化后,会生成一条执行计划,这个执行计划展示了接下来执行查询的具体方式,比如多表连接的顺序是什么,采用什么访问方法来具体查询每个表等。设计mysql的大叔贴心地提供explain语句,可以让我们查看某个查询语句的具体执行计划。除了select开头的查询语句,其余的delete,insert,update,replace语句前面都可以加上explain这个词,用来查看这些语句的执行计划

weixin_45504565的博客 1516

第七阶段【MySQL索引和锁】03:执行计划

执行计划

weixin_40612128的博客 147

Mysql Explain执行计划详解

有了慢查询语句后,就要对语句进行分析。一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。EXPLAIN语句来帮助我们查看某个查询语句的具体执行计划,我们需要搞懂EPLATNEXPLAIN的各个输出项都是干嘛使的,从而可以有针对性的提升我们查询语句的性能。

技术与业务融合思维 1122

MySQL执行计划详解Explain

MySQL执行计划详解Explain

samker的博客 1万+

Mysql执行计划-看这一篇就够了

Mysql执行计划

GM_115的博客 1万+

EXPLAINmysql 执行计划分析详解

MySQL中,你可以使用EXPLAIN命令来生成查询的执行计划EXPLAIN命令可以显示MySQL如何使用键来处理SELECT和DELETE语句,以及INSERT或UPDATE语句的WHERE子句。这对于了解查询的性能瓶颈以及优化查询非常有用。

程序吟游的博客 4747

MySQL核心面试题】MySQL 核心 - Explain 执行计划详解

欢迎关注公众号(文章末尾即可扫码关注) ,持续在我后台回复 「资料」 可领取在我后台回复「面试」可领取该文章内容已经收录在,包含底层原理解析,带你冲破面试迷雾。

qq_45260619的博客 1192

MySQL EXPLAIN执行计划详解

MySQL EXPLAIN工具使用指南 EXPLAINMySQL的性能分析工具,用于查看SQL语句的执行计划。它能显示查询的执行细节,包括表读取顺序、操作类型、索引使用情况等。基本语法为EXPLAIN SELECT...,MySQL 8.0+还支持TREE/JSON格式和ANALYZE模式。

无论云泥意贯一 1567

mysql explain执行计划详解

前言 在日常开发中,经常会碰到mysql性能调优的问题,比如说某个功能一开始使用的时候,响应挺快,但是随着时间的推移,应用的访问量,数据量上去之后,发现越来越慢,甚至更糟糕,通常来说,排除了网络相关的因素之后,大多数情况下都是由sql问题引起的 因此,如何对查询的sql语句进行优化就成了关键所在,但是对不少开发同学来说,sql调优的范围太大,经常会显得无从下手,基于经验是一方面,另一方面需要对一条sql的底层执行原理有着较为深入的理解,这样才不会显得毫无头绪,其中,掌握explain关键字的使用对于mysq

congge 5632

MySQL高级 之 explain执行计划详解

使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。explain执行计划包含的信息其中最重要的字段为:id、type、key、rows、Extra各字段详解idselect查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序 三种情况: 1、id相同:执行顺序由上至下 2、id不同:

wuseyukui的专栏 8万+

MySQL EXPLAIN 查看执行计划详解

MySQL EXPLAIN命令是分析SQL查询性能的关键工具,它能展示查询执行计划索引使用情况、连接方式和预估行数等信息。主要关注type列(访问类型,从最优system到最差ALL)、key列(实际使用的索引)、rows列(预估扫描行数)和Extra列(额外信息如是否使用临时表或文件排序)。优化目标是让type达到range级别以上,避免全表扫描,并尽可能使用覆盖索引(Extra显示Using index)。通过EXPLAIN分析可以识别性能瓶颈,如缺少索引、低效连接或排序问题,从而针对性优化查询。

M_Reus_11的博客 1252

MySQL EXPLAIN 使用详解执行计划分析优化

EXPLAINMySQL 提供的 SQL 语句分析工具,可以显示 SQL 语句在执行时的执行计划,包括表的访问顺序、使用的索引、连接类型、扫描行数等。通过分析 EXPLAIN 的输出结果,可以帮助我们发现 SQL 性能瓶颈,进行有针对性的优化。

ljw714的专栏 1504

MySQL系列】- Explain执行计划详解

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

记录总结工作过往 2159

MySQL优化——Explain分析执行计划详解

在应用的的开发过程中,由于初期数据量小,开发人员写 SQL 语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多 SQL 语句开始逐渐显露出性能问题,对生产的影响也越来越大,此时这些有问题的 SQL 语句就成为整个系统性能的瓶颈,因此我们必须要对它们进行优化,本章将详细介绍在 MySQL中优化 SQL 语句的方法。当面对一个有 SQL 性能问题的数据库时,我们应该从何处入手来进行系统的分析,使得能够尽快定位问题 SQL 并尽快解决问题。

爱吃鸡腿的明仔 2806

mysql 执行计划工具_MySQL执行计划分析工具EXPLAIN用法详解

对于DBA来讲熟悉SQL执行计划分析技巧对于快速定位数据库性能问题至关重要,下面简单介绍一下如何分析MySQL执行计划。一、EXPLAIN用法详解EXPLAIN SELECT ……变体:1.EXPLAINEXTENDEDSELECT……将执行计划“反编译”成SELECT语句,运行SHOWWARNINGS可得到被MySQL优化器优化后的查询语句2.EXPLAINPARTITI...

weixin_28789499的博客 437

详解Mysql执行计划explain

1、MySQL语法 MySql提供了EXPLAIN语法用来进行查询分析,在SQL语句前加一个”EXPLAIN”即可。 默认情况下Mysql的profiling是关闭的,所以首先必须打开profiling set profiling="ON"mysql> show variables like "%profi%"; ------------------------ ------- | Variabl...

Hello World 2163
上一篇: MYSQL —— 一条SQL在MySQL中是如何执行
下一篇: SpringBoot实现身份证实名认证(阿里云实现)
爱玛士
博客等级 码龄6年 719粉丝 253原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值