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.mzph.cn/news/715745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 编辑工具 Jupyter notebook

Jupyter notebook Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。——Jupyter Notebook官方介绍 官网:Project Jupyter | Home Jupyter Notebook 是一个开源的交互式计算环境&#…

网页版图像处理软件开发服务:助您项目在市场竞争中脱颖而出

在当今数字化时代,图像处理在各个行业中扮演着重要的角色,虎克专注于提供定制化的网页版图像处理软件开发服务,为您的项目保驾护航。 1.网页版图像处理软件的定制化需求 1.1行业特定功能 针对不同的业务需求,深入了解行业特点&…

springboot基于web的酒店客房管理系统论文

基于web的酒店客房管理系统 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了酒店客房管理系统的开发全过程。通过分析酒店客房管理系统管理的不足,创建了一个计算机管理酒店客房管理系统的方案。文…

springboot网站开发-idea开发环境下无法开启调试Debug模式

springboot网站开发-idea开发环境下无法开启调试Debug模式的解决办法。 近期在写后端代码的时候,发现,无法开启调试模式。网上查询了一下资料,发现需要做如下修改即可开启调试模式。 如图所示,把里面的选项,都放弃勾选…

SQLPro Studio:数据库管理的革命性工具 mac版

SQLPro Studio是一款强大的数据库管理和开发工具,它旨在提供高效、便捷和安全的数据库操作体验。无论是数据库管理员、开发人员还是数据分析师,SQLPro Studio都能满足他们在数据库管理、查询、设计和维护方面的需求。 SQLPro Studio mac版软件获取 首先…

B树系列(详解)

目录 一、B-树 二、B树 三、B*树 四、时间复杂度 五、Mysql与B树系列 一、B-树 首先再说B树的性质以及其他的之前,先要说一声,好多人都把这个树叫B减树,其实不是,他就叫B树,至于原因我觉的没必要再这个名字上纠结…

docker 转为docker-compose(composerize 命令)

可以使用Composerize将Docker命令转换为Docker Compose文件。 例如:将docker run命令转换为Docker Compose格式,只需用Composerize运行它,如下所示: composerize docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/…

【JavaSE】异常

异常概述 异常指的是程序在执行的过程中,出现的非正常情况,如果不处理最终会导致JVM的非正常停止。 在Java中,使用不同的类来表示不同的异常(正所谓万物皆对象,因此异常也使用类来表示)。一旦程序出现某种…

【HTML】HTML基础5(特殊字符)

目录 特殊字符的作用 常用的特殊字符 使用效果 特殊字符的作用 例如 当我在两个文字间打出空格时 <p>“银河护卫队”系列 在漫威电影宇宙中一直是异数般的存在&#xff0c;不仅因为影片主角是一群反英雄&#xff0c;<strong>与超级英雄相比显得格格不入<…

LeetCode 刷题 [C++] 第347题.前 K 个高频元素

题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 题目分析 据题意可知&#xff0c;我们需要先遍历整个数组&#xff0c;并统计每个数字出现的次数&#xff0c;保存在哈希表中&#xff1b;对元素…

synchrosized 的可重入特性、死锁、哲学家就餐问题以及解决死锁的方法等干货

文章目录 &#x1f490;synchrosized的可重入特性关于死锁&#xff1a;哲学家就餐问题&#x1f4a1;如何避免/解决死锁 &#x1f490;synchrosized的可重入特性 可重入特性&#xff1a;当一个线程针对一个对象同时加锁多次&#xff0c;不会构成死锁&#xff0c;这样的特性称为…

前端学习第一天-html基础

达标要求 网页的形成过程 常用的浏览器及常见的浏览器内核 web 标准三层组成 什么是HTML 熟练掌握HTML文档结构 熟练掌握HTML常用标签 1. 初识web前端 Web前端是创建Web页面或App等前端界面呈现给用户的过程。 Web前端开发是从网页制作演变而来&#xff0c;早期网站主…

sklearn.preprocessing.RobustScaler(解释和原理,分位数,四分位差)

提示&#xff1a;sklearn.preprocessing.RobustScaler&#xff08;解释和原理&#xff0c;分位数&#xff0c;四分位差&#xff09; 文章目录 [TOC](文章目录) 一、RobustScaler 是什么&#xff1f;二、代码1.代码2.输出结果 总结 提示&#xff1a;以下是本篇文章正文内容&…

ELK学习

ELK 一、ELK介绍 &#x1f604; “ELK”是三个开源项目的首字母缩写&#xff0c;这三个项目分别是&#xff1a;Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道&#xff0c;能够同时从多个来源采集数据&#xff0…

网络编程(IP、端口、协议、UDP、TCP)【详解】

目录 1.什么是网络编程&#xff1f; 2.基本的通信架构 3.网络通信三要素 4.UDP通信-快速入门 5.UDP通信-多发多收 6.TCP通信-快速入门 7.TCP通信-多发多收 8.TCP通信-同时接收多个客户端 9.TCP通信-综合案例 1.什么是网络编程&#xff1f; 网络编程是可以让设…

网络安全-appcms-master

一、环境 gethub上面自己找appcms-master 二、开始闯关 原理&#xff1a;在评论的时候提交可以提交到管理员列表去&#xff0c;管理员一看cookie和地址就被盗走了 点进去软件后会发现提交按钮 随便提交一下看看 放到div标签里面是不是有可能可以做&#xff0c;看看后台吧 那…

VUE CLI3项目搭建 ESLint配置

VUE项目框架配置 一、工具准备 Node.js安装 安装方法&#xff1a;点击查看WebStorm安装 下载地址&#xff1a;点击查看 二、环境准备 镜像准备 1.查看代理&#xff1a;npm get registry 2.设置淘宝镜像 2.1临时使用. npm --registry https://registry.npm.taobao.org ins…

【电机仿真】空间矢量脉宽调制(SVPWM)算法与实现

前言 文章【电机仿真】永磁同步电机模型中所提及了PMSM数学模型&#xff0c;模型算法是电机控制的理论基础&#xff0c;但在实际控制中&#xff0c;需要将这两部分具象化。实际电机所需要的总是三相电流或者电压&#xff0c;控制对象为逆变器中的开关器件&#xff0c;我们需要将…

springboot基于web的音乐网站论文

音乐网站 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了音乐网站的开发全过程。通过分析音乐网站管理的不足&#xff0c;创建了一个计算机管理音乐网站的方案。文章介绍了音乐网站的系统分析部分&#xff0c…

114.龙芯2k1000-pmon(13)- 串口如何用

本文是讲原理图的部分&#xff0c;跟pmon的关系不大&#xff01;&#xff01; 参考手册&#xff1a;《龙芯2K1000处理器用户手册.pdf》 刚刚看数据手册&#xff0c;让我是有点惊讶&#xff0c;但是也让我迷惑。&#xff08;一个串口复用为4个是啥意思&#xff1f;&#xff09;…