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.rhkb.cn/news/266993.html

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

相关文章

leetcode日记(34)通配符匹配

这道题做了很久很久……一开始我想用的方法是使用双指针,分别指向两数组,然后依次按照题目中的规则遍历,做了很久发现时间超限了!这是我最后超时的代码! class Solution { public:bool isMatch(string s, string p) {…

【C语言】指针详细解读1

1. 内存和地址 1.1 内存 在讲述内存之前,我们先拿生活中的例子类比一下: 假如我们要寻找酒店的一位朋友,首先我得知道以下一些信息:知道他是人,知道酒店名,知道酒店房间号。人就表示我们不能去找其他的…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:Flex布局)

说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 仅当父组件是 Flex、Column、Row 、GridRow时生效。 flexBasis flexBasis(value: number | string) 设置组件的基准尺寸。 卡片能力: 从A…

【MySQL】学习多表查询和笛卡尔积 - 副本

](https://img-blog.csdnimg.cn/21dd41dce63a4f2da07b9d879ad0120b.png#pic_center) ??个人主页: ??热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ??个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-N8PeTKG6uLu4bJuM {font-family:“trebuchet ms”,…

手写数字识别(慕课MOOC人工智能之模式识别)

问题:手写数字识别 数据集 数据集链接请点击我 代码 %mat2vector.m function [data_] mat2vector(data,num)[row,col,~] size(data);data_zeros(num,row*col);for page 1:numfor rows 1:rowfor cols1:coldata_(page,((rows-1)*colcols)) im2double(data(rows,cols…

移动互联网时代的APP上架流程和要点

摘要 本文将介绍移动应用程序上架的基本流程和要点,包括应用商店注册、APP材料准备、打包上传App、APP审核以及发布APP的详细步骤。此外,还会提到利用appuploder工具简化iOS应用上架步骤的方法, 引言 在移动互联网时代,开发一…

【JavaEE】_HttpServletResponse类

目录 1. 核心方法 2. 关于setStatus(400)与sendError 2.1 setStatus(400) 2.2 sendError 3. setHeader方法 4. 构造重定向响应 4.1 使用setHeader和setStatus实现重定向 4.2 使用sendRedirect实现重定向 本专栏已有文章介绍HttpServlet和HttpServletRequest类&#…

加密与安全_探索对称加密算法

文章目录 概述常用的对称加密算法AESECB模式CBC模式 (推荐)ECB VS CBC 附:AES工具类总结 概述 对称加密算法是一种加密技术,使用相同的密钥来进行加密和解密数据。在这种算法中,发送方使用密钥将明文(未加密的数据)转…

【HDFS】Decommision(退役) EC数据节点剩最后几个块卡住的问题

一、背景 近期操作退役EC集群的节点。在退役的过程中,遇到了一些问题。特此总结一下。 本文描述的问题现象是: 每一批次退役10个节点,完全退役成功后开始操作下一批。 但是,中间有一批次有2台节点的Under Replicated Blocks一直是1,不往下降。 处于Decommissioning状态卡…

使用docker方式测试部署django项目(客户催)

需求 1:已有django项目–weidanyewu 2:希望在服务器上测试部署–客户催 3:没完善django的启动 4:使用临时数据库进行演示 5:使用python3.10版本镜像 6:展示端口80 7:后台执行django程序 8&#…

MATLAB练习题:排队论问题的模拟

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 下面我们来看一道排队论的题目。假设某银行工作时间内只有一个…

【前端素材】推荐优质后台管理系统网页Highdmin平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理和控制网站、应用程序或系统的管理界面。它通常被设计用来让网站或应用程序的管理员或运营人员管理内容、用户、数据以及其他相关功能。后台管理系统是一种用于管理网站、应用程序或系统的工具,通常由管理员使…

如何搭建自己的图床

前言 简单来说,图床是一种在线服务,允许用户上传、存储和分享图片。当把图片上传到该服务器上后,便能在互联网上通过链接来使用该图片,尤其是在不允许直接上传图片文件的平台上,也有些平台不允许上传其他平台的图片文…

【Web】青少年CTF擂台挑战赛 2024 #Round 1 wp

好家伙,比赛结束了还有一道0解web题是吧( 随缘写点wp(简单过头,看个乐就好) 目录 EasyMD5 PHP的后门 PHP的XXE Easy_SQLi 雏形系统 EasyMD5 进来是个文件上传界面 说是只能上传pdf,那就改Content-Type为application/pdf,改…

【Django】执行查询—跨关系查询中的跨多值关联问题

跨多值查询 跨越 ManyToManyField 或反查 ForeignKey (例如从 Blog 到 Entry )时,对多个属性进行过滤会产生这样的问题:是否要求每个属性都在同一个相关对象中重合。 filter() 先看filter(),通过一个例子看&#xf…

Java 学习和实践笔记(26):组合(component)的含义以及与继承(extends)的关系

组合的两个作用: 1)通过将父类对象作为子类的属性 2)通过第1点的作用,实现了代码复用。 示例代码: public class TestComponent {public static void main(String[] args) {Student2 s1 new Student2("jason&…

MySQL 存储过程批量插入总结

功能需求背景:今天接到产品经理核心业务表的数据压测功能,让我向核心业务表插入百万级的业务量数据,我首先想到的办法就是存储过程实现数据的批量 。 由于无法提供核心业务表,本文仅仅提供我刚刚自己创建的表bds_base_user 表做相…

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

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

FPGA之带有进位逻辑的加法运算

module ADDER( input [5:0]A, input [5:0]B,output[6:0]Q ); assign Q AB; endmodule 综合结果如下图所示: 使用了6个Lut,,6个LUT分布…

2023年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中,敬请期待…

2023年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中,敬请期待… 武汉唯众智创科技有限公司 2024 年 2 月 联系人:辜渝傧13037102709 题号:试题01 模块三:业务分析与可视化 (一&#xff0…