MySQL篇—执行计划介绍(第二篇,总共三篇)

☘️博主介绍☘️

✨又是一天没白过,我是奈斯,DBA一名✨

✌️擅长Oracle、MySQL、SQLserver、Linux,也在积极的扩展IT方向的其他知识面✌️

❣️❣️❣️大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注❣️❣️❣️

    士别三日,自上次分享以来,大家应该对上篇的文章内容进行了深入消化与理解。今天给大家带来第二篇的内容——执行计划。在上篇文章中我们有了解到optimizer优化器根据统计信息对每个sql语句执行最优的执行计划(执行计划受统计信息影响)。并且通过执行计划能够帮助我们了解数据库在执行查询时采用的具体策略、使用的索引以及各种操作的执行顺序等信息,因此对于SQL查询的优化非常重要。

    因为统计信息和执行计划涉及到的内容过多,为了使大家更好消化,我将分成三篇文章来进行介绍,以便大家因为篇幅过长而感到阅读疲惫。三篇的内容分别如下,让大家先做了解:

第一篇:持久化和非持久化统计信息介绍

第二篇:执行计划介绍(当前篇)

第三篇:执行计划之覆盖索引Using index和条件过滤Using where详细介绍


目录

查看SQL的执行计划

explain语法一:explain + SQL语句(默认FORMAT = TRADITIONAL输出格式为表格)

explain语法二:explain FORMAT = JSON + SQL语句

explain语法三:explain FORMAT = TREE + SQL语句

explain语法四:explain analyze + SQL语句


废话不多说,让我们开始今天的内容。

    MySQL中的SQL执行计划能够帮助我们了解数据库在执行查询时采用的具体策略、使用的索引以及各种操作的执行顺序等信息,因此对于SQL查询的优化非常重要。下面是SQL执行计划在SQL查询优化中的作用:

1)评估查询性能:SQL 执行计划可以让我们了解到 MySQL 在执行查询时所采用的具体策略和每个步骤所需的时间,从而评估查询的性能表现。比如,我们可以查看每个操作使用的索引类型或临时表的创建情况,有助于我们确定查询是否需要进行优化,以及应该优化哪些部分。

2)定位性能问题:如果SQL查询执行缓慢,我们可以通过 SQL 执行计划来定位性能问题所在。例如,我们可以查看查询语句中是否存在不必要的排序、全表扫描、临时表创建等问题,从而确定性能瓶颈并进行调整。

3)判断索引是否有效:SQL 执行计划可以让我们了解到 MySQL 是否使用了正确的索引来执行查询,进而判断我们为表设置的索引是否有效。如果 MySQL 没有使用索引,那么可能是我们设置的索引有问题,需要重新考虑索引的创建方式。

4)选择正确的查询方案:在SQL查询优化中,有时候我们需要选择不同的查询方案来完成同样的查询操作。SQL 执行计划可以让我们了解到MySQL计划使用哪种查询方案,并可以根据不同的情况调整查询方案或者SQL语句结构。

总之,SQL 执行计划是 SQL 查询优化的重要工具,可以帮助我们找到问题所在,优化查询性能并提高数据库的运行效率。

              

查看SQL的执行计划

    通过explain查看执行计划的方式有多种,今天主要是详细介绍语法一,其他的方式我这里不多做介绍,因为都是大同小异,有兴趣的小伙伴可以私信我。

EXPLAIN语法:

官方文档对EXPLAIN的介绍:MySQL :: MySQL 8.0 Reference Manual :: 15.8.2 EXPLAIN Statement

{EXPLAIN | DESCRIBE | DESC}

    tbl_name [col_name | wild]

{EXPLAIN | DESCRIBE | DESC}

    [explain_type]

    {explainable_stmt | FOR CONNECTION connection_id}

{EXPLAIN | DESCRIBE | DESC} ANALYZE [FORMAT = TREE] select_statement

explain_type: {

    FORMAT = format_name

}

format_name: {

  | TRADITIONAL

  | JSON

  | TREE

}

explainable_stmt: {

  | SELECT statement

  | TABLE statement

  | DELETE statement

  | INSERT statement

  | REPLACE statement

  | UPDATE statement

}

EXPLAIN [options] FOR CONNECTION connection_id:获取在命名连接中执行的可解释语句的执行计划。意思就是在另一个会话上去查看其他会话正在执行SQL的执行计划,通常的做法是在另一个会话上输入show porcesslist(或者其他查询SQL的语句),有正在执行的SQL那么通过EXPLAIN [options] FOR CONNECTION加上show processlist输出的ID,那么可以看到相关SQL的执行计划。

FORMAT = format_name:选项可用于选择输出格式。默认以表格格式显示输出(FORMAT = TRADITIONAL)。可以指定其他输出格式,JSON格式以JSON格式显示信息(FORMAT = JSON)。在MySQL 8.0.16及更高版本中,TREE提供了树状输出(FORMAT = TREE),比传统格式更精确地描述了查询处理,并且它是唯一显示哈希连接用法的格式,和EXPLAIN ANALYZE输出的内容大致相同。在MySQL 8.0.32中添加的explain_format系统变量在用于获取表列信息时,影响对explain的输出,参数的值包括TRADITIONAL (DEFAULT)、JSON、TREE。

explainable_stmt:EXPLAIN适用于SELECT、DELETE、INSERT、REPLACE和UPDATE语句的执行计划的解析。在MySQL 8.0.19及更高版本中,它还可以使用TABLE语句,TABLE语句是MySQL 8.0.19中引入的DML语句,它返回指定表的行和列,和SELECT查询表有些类似,但功能又没SELECT多。

注意:SQL语句加上explain不会真正执行SQL语句,它仅会模拟MySQL在执行该语句时所做的操作,并返回MySQL在执行该语句时使用的查询计划信息。

            

explain语法一:explain + SQL语句(默认FORMAT = TRADITIONAL输出格式为表格)

mysql> explain select * from tb t1 join tb2 t2 on t1.id=t2.id;

需要特别关注的字段type、possible_keys、key、key_len、ref、rows、Extra。官方文档解释输出列:MySQL :: MySQL 8.0 Reference Manual :: 10.8.2 EXPLAIN Output Format

id(JSON名称:select_id):SELECT标识符。这是查询中SELECT的序列号。如果该行引用其他行的并集结果,则该值可以为NULL。在这种情况下,表列显示一个类似于<union M,N>的值,表示该行指的是id值为M和N的行的并集。

select_type(JSON名称:无):SELECT的类型JSON格式的EXPLAIN将SELECT类型公开为query_block的属性,除非它是SIMPLE或PRIMARY。类型比较多,参考官方文档。

table(JSON名称:table_name)输出行所引用的表的名称。

partitions(JSON名称:partitions查询将从中匹配记录的分区。对于未分区的表该值为NULL。

type(JSON名称:access_type)联接类型。类型比较多,参考官方文档。

possible_keys(JSON名称:possible_ keys):possible_keys列表示MySQL可以从中选择查找该表中的行的索引。请注意,此列完全独立于EXPLAIN输出中显示的表的顺序。这意味着possible_keys中的一些键在实际中可能无法使用生成的表顺序。如果此列为NULL(或在JSON格式的输出中未定义),则不存在相关索引。在这种情况下,您可以通过检查WHERE子句来检查它是否引用了适合进行索引的一个或多个列,从而提高查询的性能。如果是,请创建一个适当的索引ALTER TABLE语句,并再次使用EXPLAIN检查查询。要查看表的索引,请使用SHOW INDEX FROM tbl_name。

keyJSON名称key):这key列表示MySQL实际决定使用的键(索引)。如果MySQL决定使用possible_keys索引来查找行,该索引被列为键值。有可能key可以命名一个不在possible_keys价值。如果没有一个possible_keys索引适合于查找行,但是查询选择的所有列都是其他索引的列。也就是说,命名索引覆盖了所选的列,因此尽管它不用于确定要检索哪些行,但索引扫描比数据行扫描更有效。

为InnoDB,即使查询也选择了主键,辅助索引也可能会覆盖选定的列,因为InnoDB存储每个辅助索引的主键值。如果key是NULL,MySQL找不到索引来更有效地执行查询。要强制MySQL使用或忽略possible_keys列,使用FORCE INDEX, USE INDEX,或者IGNORE INDEX在您的查询中。看见第8.9.4节,“索引提示”.

为MyISAM表格,运行ANALYZE TABLE帮助优化器选择更好的索引。为MyISAM表格,myisamchk -分析做同样的事。看见13.7.3.1,“分析表语句”一节,以及第7.6节,“MyISAM表维护和故障恢复”.

key_len(JSON名称:key_length):key_len列表示MySQL决定使用的密钥的长度。key_len的值使您能够确定MySQL实际使用多部分密钥的多少部分。如果key列表示NULL,那么key_len列也表示NULL。由于密钥存储格式的原因,可以为NULL的列的密钥长度比NOT NULL列的密钥长一个。

ref(JSON名称:ref):ref列显示将哪些列或常量与键列中命名的索引进行比较,以便从表中选择行。如果该值是func,则使用的值是某个函数的结果。要查看哪个函数,请在EXPLAIN后面使用SHOW WARNINGS来查看扩展的EXPLAIN输出。函数实际上可能是一个运算符,例如算术运算符。

rows(JSON名称:rowsrows列表示MySQL认为执行查询必须检查的行数。这里的行数和自动更新持久化统计信息是一致的,所以会出现与实际count(*)数据量差距较大,可以这个文档的2、统计信息的案例“(6)解决统计信息差别较大的问题(执行计划受统计信息影响,统计信息不准会导致执行计划不准)”

filtered(JSON名称:filtered)已筛选列表示按表条件筛选的表行的估计百分比。最大值为100,这意味着没有对行进行筛选。从100开始递减的值表示过滤量的增加。rows显示检查的估计行数,rows×filtered显示与下表连接的行数。例如,如果行数为1000,过滤后的行数为50.00(50%),则与下表连接的行数是1000×50%=500。

Extra(JSON名称:无):本列包含有关MySQL如何解析查询的其他信息没有一个JSON属性对应于Extra列;但是,此列中可能出现的值将作为JSON属性或消息属性的文本公开。类型比较多,参考官方文档。

                  

explain语法二:explain FORMAT = JSON + SQL语句

mysql> explain FORMAT = JSON select * from tb t1 join tb2 t2 on t1.id=t2.id\G;

            

explain语法三:explain FORMAT = TREE + SQL语句

mysql> explain FORMAT = TREE select * from tb t1 join tb2 t2 on t1.id=t2.id\G;

               

explain语法四:explain analyze + SQL语句

mysql> explain analyze select * from tb t1 join tb2 t2 on t1.id=t2.id\G;

    今天执行计划的内容就介绍到这里,只是对执行计划输出的内容做了介绍,下一篇我会用实例执行的执行计划的案例来介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/421864.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣SQL50 大的国家 查询

Problem: 595. 大的国家 Code select name,population,area from World where area > 3000000 or population > 25000000;

JS:原型与原型链(附带图解与代码)

一、原型 写在前面: 任何对象都有原型。 函数也是对象,所以函数也有原型。 1.什么是原型 在 JavaScript 中,对象有一个特殊的隐藏属性 [[Prototype]],它要么为 null,要么就是对另一个对象的引用,该对象…

数据可视化原理-腾讯-热力图

在做数据分析类的产品功能设计时,经常用到可视化方式,挖掘数据价值,表达数据的内在规律与特征展示给客户。 可是作为一个产品经理,(1)如果不能够掌握各类可视化图形的含义,就不知道哪类数据该用…

特殊设计模式

▶实现一个类,不能被拷贝 ▶实现一个类,只能在堆上创建 ❗实现一个类,只能创建在栈上 ❗设计一个不能继承的类 ❗单例模式——一个类只能生成一个对象   ❔饿汉模式——在每次程序启动都会自动生成一个对象   ❓懒汉模式——在第一次需要…

【数学建模获奖经验】2023第八届数维杯数学建模:华中科技大学本科组创新奖获奖分享

2024年第九届数维杯大学生数学建模挑战赛将于:2024年5月10日08:00-5月13日09:00举行,近期同学们都开始陆续进入了备赛阶段,今天我们就一起来看看上一届优秀的创新奖选手都有什么获奖感言吧~希望能帮到更多热爱数学建模的同学。据说点赞的大佬…

javaWebssh票据管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh票据管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模 式开发。开发环境为TOMCAT7.0,My…

npm digital envelope routines::unsupported

问题描述:npm运行命令报错:digital envelope routines::unsupported 原因:node版本过高 解决方案:在运行命令之前加上 SET NODE_OPTIONS--openssl-legacy-provider && SET NODE_OPTIONS--openssl-legacy-provider &&a…

【机器学习基础】层次聚类-BIRCH聚类

🚀个人主页:为梦而生~ 关注我一起学习吧! 💡专栏:机器学习 欢迎订阅!相对完整的机器学习基础教学! ⭐特别提醒:针对机器学习,特别开始专栏:机器学习python实战…

【JavaEE】_Spring Web MVC简介

目录 1. Spring Web MVC简介 2. MVC简介 3. Spring MVC 1. Spring Web MVC简介 官网对于Spring Web MVC的介绍如下: 链接如下: https://docs.spring.io/spring-framework/reference/web/webmvc.html#https://docs.spring.io/spring-framework/refer…

14.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据包分析工具界面与通信设计

内容参考于: 易道云信息技术研究院VIP课 上一个内容:13.如果没有工具就创造工具 码云地址(master 分支):https://gitee.com/dye_your_fingers/titan 码云版本号:fef5089bd11dfb86ae8b4e26f25cf59e85f896…

缓存穿透解决方案之布隆过滤器

布隆过滤器可以快速判断数据是否存在,避免从数据库中查询数据是否存在,减轻数据库的压力 布隆过滤器是由一个初值为0的bit数组和N个哈希函数,可以用来快速的判断某个数据是否存在 当我们想要标记某个数据是否存在时,布隆过滤器会…

《Spring Security 简易速速上手小册》第6章 Web 安全性(2024 最新版)

文章目录 6.1 CSRF 防护6.1.1 基础知识详解CSRF 攻击原理CSRF 防护机制最佳实践 6.1.2 重点案例:Spring Security 中的 CSRF 防护案例 Demo测试 CSRF 防护 6.1.3 拓展案例 1:自定义 CSRF 令牌仓库案例 Demo测试自定义 CSRF 令牌仓库 6.1.4 拓展案例 2&am…

动态规划(算法竞赛、蓝桥杯)--分组背包DP

1、B站视频链接&#xff1a;E16 背包DP 分组背包_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N110; int v[N][N],w[N][N],s[N]; // v[i,j]:第i组第j个物品的体积 s[i]:第i组物品的个数 int f[N][N]; // f[i,j]:前i组物品&#xff0c;能放…

【如何像网吧一样弄个游戏菜单在家里】

GGmenu 个人家庭版游戏、应用管理 桌面图标管理器

Tomcat概念、安装及相关文件介绍

目录 一、web技术 1、C/S架构与B/S架构 1.1 http协议与C/S架构 1.2 http协议与B/S架构 2、前端三大核心技术 2.1 HTML&#xff08;Hypertext Markup Language&#xff09; 2.2 css&#xff08;Cascading Style Sheets&#xff09; 2.3 JavaScript 3、同步和异步 4、…

day08_分类品牌管理商品规格管理商品管理

文章目录 1 分类品牌管理1.1 菜单添加1.2 表结构介绍1.3 页面制作1.4 品牌列表加载1.4.1 后端接口BrandControllerBrandServiceBrandMapperBrandMapper.xml 1.4.2 前端对接brand.jscategoryBrand.vue 1.5 分类数据加载1.6 列表查询1.6.1 需求说明1.6.2 后端接口需求分析Categor…

高中数学:函数解析式的求法

一、待定系数法 用于&#xff0c;已知函数f(x)类型&#xff0c;求具体解析式的题目 关键解题步骤&#xff1a; 二、换元法 针对f(表达式)&#xff0c;表达式较复杂&#xff0c;且可以被换元表示的情况 关键解题步骤&#xff1a; 三、整体代换法 针对f(表达式1)表达式2…

C++的引用

目录 引用 常引用 指针与引用的关系 小拓展 引用的价值 做形参 传值、传引用的效率比较 做返回值 函数传值返回 函数传引用返回&#xff08;错误示范&#xff09; 野引用&#xff08;错误示范&#xff09; 引用的正常应用 值和引用作为返回值类型的性能比较 引用和…

人才测评系统的作用与应用场景有哪些?

人才测评有助于我们对于人才进行量化&#xff0c;例如&#xff1a;专业技能测评&#xff0c;性格的测评&#xff0c;以及智商和情商的测评&#xff0c;那么这些的集合就是一种人才的量化&#xff0c;通过这些属性参数&#xff0c;我们可以客观描述什么是“人才”。 那么人才测…

opencv VideoCapture

videocapture顾名思义视频捕捉&#xff0c;主要是从视频文件、摄像头或网络摄像头获取视频流数据&#xff0c;并将其作为一系列帧进行处理。 我们这里主要实现了获取项目文件夹下的1.mp4视频文件&#xff0c;然后经过灰度变化、均值滤波、边缘检测然后将视频显示出来 #include…
最新文章