返回顶部
首页 > 资讯 > 数据库 >一文带你了解SQL的执行计划(explain)
  • 783
分享到

一文带你了解SQL的执行计划(explain)

数据库mysqlexplain执行计划分析 2023-08-31 15:08:19 783人浏览 薄情痞子
摘要

一. 什么是sql执行计划 为什么关注sql的执行计划,因为一个sql的执行计划可以告诉我们很多关于如何优化sql的信息 。 通过一个sql计划,如何访问中的数据 (是使用全表扫描还是索引查找?

一. 什么是sql执行计划

为什么关注sql的执行计划,因为一个sql的执行计划可以告诉我们很多关于如何优化sql的信息 。

通过一个sql计划,如何访问中的数据 (是使用全表扫描还是索引查找?)

一个表中可能存在多个表中不同的索引,表中的类型是什么是否子查询、关联查询等…

sql学习来自于sqlercn讲师

  • 了解SQL如何访问表中的数据
  • 了解SQL如何使用表中的索引
  • 了解SQL所使用的查询类型

二. 获取SQL执行计划

在sql前加上explain 关键词就可以了!

请输入图片描述

MySQL8.0中是支持对select/delete/inster/replace/update语句来分析执行计划

MySQL5.6前只支持对select语句分析执行计划。

提示: replace语句是跟inster语句非常类似,只是插入的数据和表中存在的数据(存在主键或者唯一索引)冲突的时候,replace语句会把原来的数据替换新插入的数据,表中不存在唯一的索引或主键,则直接插入新的数据

除了静态分析,MySQL8.0还可以使用for connection 来直接分析正在执行的sql。(connection_id 就是processlist表中的数据id

三. 分析执行计划

执行计划内容分析

例子1:课程人数大于3000

EXPLAINselect course_id,title,study_cntfrom imc_coursewhere study_cnt > 3000;

访问得出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ulVz8LR1-1660528543156)(https://blog.97it.net/usr/uploads/2021/07/976069882.png)]

这些字段代表什么含义呢?

四. 分析执行计划(ID列)

  • ID标识查询执行的顺序
  • ID相同时,由上到下分析执行
  • ID不同时,由大到下分析执行

ID列中的值只能有2中情况,要么是1组数字,要么是NULL

如果ID为数字序列,则说明查询的SQL语句对数据对象的操作顺序

如果是NULL,则代表数据由另外的2个查询uNIOn操作后所产生的结果集。

例子2:  【ID一致】学习人数大于3000人的课程id、课程分类、难度、课程标题、课程学习人数

explainselect course_id,class_name,level_name,title,study_cntfrom imc_course ajoin imc_class b on b.class_id=a.class_idjoin imc_level c on c.level_id =a.level_idwhere study_cnt > 3000

返回3行结果,并且ID值是一样的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4fRE2eQF-1660528543157)(Https://blog.97it.net/usr/uploads/2021/07/3819973405.png)]

由上往下读取sql的执行计划,第一行是table c表作为驱动表 ,等于是以C表为基础来进行循环嵌套的一个关联查询。  (4 *100*1 =400 总共扫描400行等到数据)

SQL优化器根据表的统计信息来进行数据的调整,实际上是由C表作为主表进行嵌套查询,sql优化动态的来调整表的关联顺序。

例子3: 【ID不一致】查询课程表中不存在课程章节的数据

explainselect  a,course_id,a.titlefrom imc_course awhere a.course_id not in (    select course_id from imc_chapter b) 

请输入图片描述

五. 分析执行计划(select_type列)

含义
SIMPLE不包含子查询或者UNION操作的查询(简单查询
PRIMARY查询中如果包含任何子查询,那么最外层的查询则被标记为PRIMARY
SUBQUERYselect列表中的子查询
DEPENDENT SUBQUERY依赖外部结果的子查询
UNIONunion操作的第二个或之后的查询只为union
DEPENDENT UNIONunion作为子查询时,第二或是第二个后的查询的select_type值
UNION RESULTunion产生的结果集
DERIVED出现在from子句中的子查询 (派生表)

例子1 : 查询学习人数大于3000 合并 课程是Mysql的记录

EXPLAINSELECT course_id,class_name,level_name,title,study_cntFROM imc_course ajoin imc_class b on b.class_id =a.class_idjoin imc_level c on c.level_id = a.level_idWHERE study_cnt > 3000unionSELECT course_id,class_name,level_name,title,study_cntFROM imc_course ajoin imc_class b on b.class_id = a.class_idjoin imc_level c on c.level_id = a.level_idWHERE class_name ='mysql'

请输入图片描述

先看id等于2

id=2 则是查询mysql课程的sql信息,分别是b,a,c 3个表,是union操作,selecttype为是UNION

id=1 为是查询学习人数3000人的sql信息,是primary操作的结果集,分别是c,a,b3个表,select_type为PRIMARY

最后一行是NULL, select_type是union RESULT 代表是2个sql 组合的结果集。

六. 分析执行计划(table列)

指明是从那个表中获取数据

就展示数据库表名 (如果表取了别名就显示别名)

由ID为M,N 查询union产生的结果集

/ 由ID为N的查询产生的结果(通常也是一个子查询的临时表)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LWAjTCVy-1660528543160)(https://blog.97it.net/usr/uploads/2021/07/1972183977.png)]

七. 分析执行计划(partition列)

  • 对于查询分区表,显示查询的分区ID
  • 对于非分区表,显示NULL

八. 分析执行计划(type列)【重要】

注意的: 是在mysql中不一定是使用JOIN才算是关联查询,实际上mysql会认为每一个查询都是连接查询

就算是查询一个表,对mysql来说也是关联查询。

type的取值是体现了mysql访问数据的一种方式。

type列的值按照性能高到低排列   system > const > eq_ref > ref > ref_or_null > index_merge > range > index > ALL

含义
system这是const连接类型的特例,当查询的表只有一行时使用
const表中有且只有一个匹配的行时使用,如对主键或唯一索引的查询,这是效率最高的链接方式
eq_ref唯一索引或主键查询,对应每个索引建,表中只有一条记录与之匹配 【A表扫描每一行B表只有一行匹配满足】
ref非唯一索引查找,返回匹配某个单独值的所有行
ref_or_null类似于ref类型的查询,但是附加了对NULL值列的查询
index_merge该链接类型表示使用了索引合并优化方法
range索引范围扫描,常见于between、>、< 这样的查询条件
indexFULL index Scan全索引扫描,同ALL的区别是,遍历的是索引树
ALLFULL TABLE Scan全表扫描 ,这是效率最差的链接方式

举例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N9NTW3u2-1660528543160)(https://blog.97it.net/usr/uploads/2021/07/649653009.png)]

拿以上的sql语句分析

这里先分析ID不同,由大到小,ID相同由上到下。

  1. 「ID=1 union , select_type= PRIMARY  」C表 就是imc_level 作为驱动主表,a表level_id没加索引,他是ALL是全表扫描的,没有一个可用的索引。
  2. 「ID=1 , select_type= PRIMARY 」 ,a表 就是imc_course,a表class_id加了索引,但是没where去查询,并且数量量小也会走全表扫描, 也是ALL全表扫描,没有一个可用的索引。`
  3. 「 ID=1 , select_type= PRIMARY 」 , b表 就是imc_class , a表class_id加了索引跟class表的主键对应, 是eq_ref 对应每个索引建,表中只有一条记录与之匹配,嵌套循环查找,B表通过A表的class_id关联查找。 【一条记录匹配】
  4. 「 ID=2 , select_type= union 」,b表就是imc_class ,是const ,因为where加了条件class_name=MySQL ,而class_name加了唯一索引,并且只匹配到一个。 【只有一行】
  5. 「 ID=2 , select_type= union 」 a表就是imc_course表,也是用到索引。匹配某个单独值的所有行
  6. union是结果集,没有索引也是通过全表扫描。

如果where like "MySQL%" ,会是什么type类型?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wTdfjfhB-1660528543161)(https://blog.97it.net/usr/uploads/2021/07/1304606973.png)]

虽然class_name 加了索引 ,但是使用where的like% 右配 所以会走索引范围扫描

如果where like "%MySQL%" , 会是什么type类型 ?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6w7Nr2G5-1660528543161)(http://blog.97it.net/usr/uploads/2021/07/536036482.png)]

虽然class_name 加了索引 ,但是使用where的%like% 左右统配 所以会走全索引扫描,如果不加索引的话,左右统配会走全表扫描。

九. 分析执行计划(possible_keys/key/key_len/ ref  列)

possible_keys说明表可能用到了哪些索引,而key是指实际上使用到的索引。

基于查询列和过滤条件进行判断。

查询出来都会被列出来,但是不一定会是使用到。

  • 指出查询中可能会用到的索引
  • 指出查询时实际用到的索引
  • 实际使用索引的最大长度

possible_keys / key

可能用到的索引

如果在表中没有可用的索引,那么key列 展示,possible_keys是NULL,这说明查询到覆盖索引。

key_len

实际用到的索引

  1. key_len是索引使用的字节数
  2. ken_len注意的是,在联合索引中,如果有3列,那么总字节是长度是100个字节的话,那么key_len值数据可能少于100字节,比如30个字节,这就说明了查询中并没有使用联合索引的所有列。而只是利用到某一些列或者2列
  3. key_len的长度是由表中的定义的字段长度来计算的,并不是存储的实际长度,所以满足数据最短的实际字段存储,因为会直接影响到生成执行计划的生成 。

ref

指出那些列或常量被用于索引查找

执行 select * from imc_user where user_id=1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8gQhxQ15-1660528543162)(http://blog.97it.net/usr/uploads/2021/07/1123411536.png)]

从头到尾看下

首先他的ID列是1 ,代表就是数据库操作对象,并不是union产生的结果集

select_type列SIMPLE 是代表简单的查询

查询所涉及的表table列imc_user表,由于这不是一个分区表所以partitions列是等于NULL 。

type列const是个常量查询,固定值是1 ,只匹配一个并且用到的索引是主键索引。

possible_keys列 可能用到的索引也是主键索引,key列 实际索引也是主键索引。因为user_id是主键

key_len列 长度是4个字节,user_id是int类型,大小也是4个字节

ref列const 也就是一个固定值,固定的常量值来进行索引过滤的。

十. 分析执行计划(rows / filtered 列)

rows列

( 有2个含义)1.、根据统计信息预估的扫描行数,

另一方面是关联查询内嵌的次数,每获取匹配一个值都要对目标表查询,所以循环次数越多性能越差。

因为扫描行数的值是预估的,所以并不准确

执行 select * from imc_user where user_id=1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HU1I5Fj7-1660528543162)(http://blog.97it.net/usr/uploads/2021/07/2916774700.png)]

拿以上举例,因为查询是一条记录,所以row是一条数据。

filtered列

表示返回结果的行数占需读取行数的百分比

filtered列跟rows列是有关联的,是返回预估符合条件的数据集,再去取的行的百分比。也是预估的值。

数值越高查询性能越好

十一.  分析执行计划(Extra列)

包括了不适合在其他列中所显示的额外信息

含义
Distinct优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作
Not exists使用not exists来优化查询
Using filesort使用文件来进行排序通常会出现在order by 或 group by 查询中
Using index使用了覆盖索引进行查询**【意思是查询所需要的信息用索引来获取,不需要对表进行访问】**
Using temporaryMySQL需要使用临时表来处理,常见于排序、子查询、和分组查询
Using where需要在MySQL服务器使用WHERE条件来过滤数据
select tables optimized away直接通过索引来获取数据,不用访问表

请输入图片描述例子1:查询课程表没有章节的信息

EXPLAINselect a.course_id,titlefrom imc_course aleft join imc_chapter b on b.course_id = a.course_idwhere b.course_id is null

可以看到a表的key列是有值的,而possible_keys是NULL,代表是采用了覆盖索引。印证了Extra列Using index 覆盖索引

【优化】 a表这个索引key是title,如果加了where条件可以优化a表的type级别。比如where tite ='xxx' or where title like "Mysql%"

而b表是type列是ref级别,匹配某个单独值的所有行,并且加了where条件。所以再Extra列是有多个的。

以上就完成分析计划所以列的说明了…

来源地址:https://blog.csdn.net/limingqiang007/article/details/126341191

您可能感兴趣的文档:

--结束END--

本文标题: 一文带你了解SQL的执行计划(explain)

本文链接: https://lsjlt.com/news/386043.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一文带你了解SQL的执行计划(explain)
    一. 什么是SQL执行计划 为什么关注sql的执行计划,因为一个sql的执行计划可以告诉我们很多关于如何优化sql的信息 。 通过一个sql计划,如何访问中的数据 (是使用全表扫描还是索引查找?...
    99+
    2023-08-31
    数据库 mysql explain 执行计划分析
  • 一文带你了解MySQL之Explain执行计划
    前言: 一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。MySQL为我们提供了E...
    99+
    2023-08-18
    mysql 数据库 大数据 数据库架构 数据库开发
  • 一文带你看懂MySQL执行计划
    目录前言explain/desc 用法explain/desc 输出详解一、id ,select 查询序列号二、select_type,查询语句类型三、table,查询涉及...
    99+
    2024-04-02
  • MySQL EXPLAIN执行计划解析
    目录前言1 调用EXPLAIN2 EXPLAIN中的列2.1 id2.2 select_type2.3 table2.4 type2.5 possible_keys2.6 key2.7 key_len2.8 r...
    99+
    2022-08-22
    MySQL EXPLAIN执行计划 MySQL EXPLAIN
  • MySQL执行计划EXPLAIN详解
    本文以MySQL 5.7 Reference Manual为主轴(翻译&取其精华)并结合网文百家之长整理而成,因为笔者水平有限,文中如有不准确之处请包涵,如转载请注明原文出处guocun...
    99+
    2024-04-02
  • mysql explain执行计划详解
    ...
    99+
    2024-04-02
  • MySQL的执行计划详解(Explain)
    1、MySQL执行计划的定义 在 MySQL 中可以通过 explain 关键字模拟优化器执行 SQL语句,从而知道 MySQL 是如何处理 SQL 语句的。 2、MySQL整个查询的过程 • 客户端向 MySQL 服务器发送一条查询请求 ...
    99+
    2023-08-19
    mysql 数据库 java
  • postgres explain如何查看sql执行计划
    这篇文章主要为大家展示了“postgres explain如何查看sql执行计划”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“postgres explain如...
    99+
    2024-04-02
  • MySQL执行计划explain的key_len解析
    作者 :沃趣科技高级数据库专家 邱文辉  ...
    99+
    2024-04-02
  • MySQL中的执行计划explain
    一、用法及定义:   explain为sql的执行计划、在sql前面加上explain关键字即可 如:explain select * from tbl_emp; 名词解释:   id:【操作表的顺序】     1.i...
    99+
    2015-01-30
    MySQL中的执行计划explain
  • 带你学习MySQL执行计划
    目录1.执行计划简介2.执行计划实战id:select_type:table:type:possible_keys:key:key_len:rows:Extra:1.执行计划简介 执行计划是指一条 SQL ...
    99+
    2022-05-26
    MySQL 执行计划
  • MySQL中Explain执行计划的案例
    这篇文章给大家分享的是有关MySQL中Explain执行计划的案例的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。1. Explain 简述Explain 语句可以查看 MySQL...
    99+
    2024-04-02
  • MySQL中通过EXPLAIN如何分析SQL的执行计划详解
    前言 在MySQL中,我们可以通过EXPLAIN命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序。 下面分别对EXPLAIN命令结果的每一列...
    99+
    2024-04-02
  • MySql中怎么使用explain查询SQL的执行计划
    这篇文章主要介绍MySql中怎么使用explain查询SQL的执行计划,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!explain命令是查看查询优化器如何决定执行查询的主要方法。这个...
    99+
    2024-04-02
  • 【MySQL】一文带你了解SQL
    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! ...
    99+
    2023-09-06
    mysql sql 数据库
  • MySQL 中,EXPLAIN执行计划的type含义
    执行计划中的 type 字段表示 MySQL 在执行查询时使用的访问类型,也就是 MySQL 在访问表时使用的算法。 以下是 MySQL 中常见的 type 类型及其含义: system:这是最高级别的访问类型,表示 MySQL 只有一行...
    99+
    2023-10-23
    mysql
  • Oracle固定SQL的执行计划(一)---SQL Profile
    我们都希望对于所有在Oracle数据库中执行的SQL,CBO都能产生出正确的执行计划,但实际情况却并非如此,由于各种各样的原因(比如目标SQL所涉及的对象的统计信息的不准确,或者CBO内部一些成本计算公式的...
    99+
    2024-04-02
  • 使用MySQL的Explain执行计划的方法(SQL性能调优)
    目录前言1. explain的使用2. explain字段详解id列select_type列table列partitions列type列systemconsteq_refrefref...
    99+
    2022-11-13
    MySQL Explain执行计划 SQL性能调优
  • MySQL执行计划explain输出列结果解析
    1) id:每个被独立执行的操作的标识,表示对象被操作的顺序;id值大,先被执行;如果相同,执行顺序从上到下。 2) select_type:查询中每个select子句的类型; 3) table:名字,被操...
    99+
    2024-04-02
  • MySQL中执行计划explain命令示例详解
    前言 explain命令是查看查询优化器如何决定执行查询的主要方法。 这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执行的。 调用EXPLA...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作