MYSQL执行过程和顺序详解

一、前言

1.1、说明

就MySQL在执行过程、sql执行顺序,以及一些相关关键字的注意点方面的学习分享内容。

在参考文章的基础上,会增加自己的理解、看法,希望本文章能够在您的学习中提供帮助。

如有错误的地方,欢迎指出纠错,互相学习,共同进步。

1.2、参考文章

十分感谢以下文章提供的帮助

https://www.cnblogs.com/wyq178/p/11576065.html

https://juejin.cn/post/7002604517913001997

https://blog.csdn.net/qq_48157004/article/details/128590851

https://cloud.tencent.com/developer/article/1882003

https://cloud.tencent.com/developer/article/1115019

二、MySQL的执行过程

2.1、MySQL数据库架构的两个主要层次

2.1.1、Server层
  • 这是 MySQL 的核心,负责管理客户端的连接、SQL 查询处理、权限管理、事务处理、数据字典等。
  • Server 层负责接收来自客户端的 SQL 查询,并将它们发送到存储引擎层进行处理。
  • 这一层是 MySQL 的核心逻辑,独立于任何特定的存储引擎,因此提供了对不同存储引擎的统一接口。
2.1.2、存储引擎层
  • 存储引擎层负责存储和检索数据。MySQL 支持多种存储引擎,每种引擎都有其独特的特性和适用场景。
  • 每个表可以根据需求选择不同的存储引擎,甚至在同一数据库中的不同表也可以使用不同的存储引擎。
  • 一些常见的 MySQL 存储引擎包括 InnoDB、MyISAM、MEMORY、CSV、ARCHIVE 等。

2.2、MySQL数据库架构图

架构图(具体详情分析可见2.3部分):

请添加图片描述

对存储引擎描述比较详细的一张架构图(可用于参考,本文章的侧重点不在存储引擎,不同的存储引擎内部实现不同)

请添加图片描述

比较官方的一张架构图

请添加图片描述

2.3、 各执行过程详情说明

2.3.1 连接器

1、建立和维护连接

连接器负责与客户端的通信,其使用的是半双工模式(一种通信方式,其中通信双方可以交替地发送和接收数据,但不能同时进行发送和接收)。首先是与访问的客户端建立TCP连接,服务器有专门的TCP连接池,采用长连接模式复用TCP连接,经过三次握手建立连接成功后,之后会对TCP传输过来的账号密码做身份认证、权限获取。在服务器内部,每个client连接都有自己的线程,即TCP连接都会分配给一个线程去执行后续的流程。这些线程轮流运行在某一个CPU内核(多核CPU)或者CPU中,缓存了线程,因此不需要为每个client连接单独创建和销毁线程 。

2、认证和权限获取

完成与访问客户端的TCP连接后,会对TCP传递过来的账号密码进行身份认证,如果账户和密码错误,会报错Access denied for user 'root'@'localhost' (using password: YES)

如果用户的账户和密码验证通过,会在MySQL自带的权限表中查询当前用户的权限(管理员可以通过GRANT和REVOKE语句来修改用户的权限),MySQL中存在4个控制权限的表,分别为user表,db表,tables_priv表,columns_priv表:

  • user表:存放用户账户信息以及全局级别(所有数据库)权限,决定了来自哪些主机的哪些用户可以访问数据库实例
  • db表:存放数据库级别的权限,决定了来自哪些主机的哪些用户可以访问此数据库
  • tables_priv表:存放表级别的权限,决定了来自哪些主机的哪些用户可以访问数据库的这个表
  • columns_priv表:存放列级别的权限,决定了来自哪些主机的哪些用户可以访问数据库表的这个字段

验证授权过程(MySQL会在用户进行操作时,动态地检查其权限信息,以决定是否允许该操作)如下所示:

  • 先从user表中的Host,User,Password这3个字段中判断连接的IP、用户名、密码是否存在,存在则通过验证。
  • 通过身份认证后,进行权限分配,按照user,db,tables_priv,columns_priv的顺序进行验证。即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db,tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。
  • 如果在任何一个过程中权限验证不通过,都会返回相应的错误。

并且MySQL支持多种身份认证方式,包括基于密码的认证、SSL/TLS证书认证等,其中,最常用的是基于密码的认证方式。

2.3.2 缓存

缓存主要是针对MySQL的查询语句进行的,如果是查询语句,MySQL服务器会将查询字符串作为key,查询结果作为value缓存到内存中。经过连接器,此时MySQL服务器已经获得到了SQL字符串,如果是查询语句,服务器会使用该查询字符串作为key,去缓存中获取,如果命中缓存,直接返回结果(返回前需要做权限的验证),未命中则执行后面的逻辑。并且,在匹配的缓存的过程中,查询字符串需要完全与key匹配才算命中(即空格、注释、大小写、某些系统函数)。当所取的数据的基表发生任何数据变化后,MySQL服务器会自动使对应的缓存失效。在读写比例非常高的应用系统中, 缓存对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。从MySQL 5.6的版本中已经默认关闭,5.7.20开始,不推荐使用查询缓存,并在MySQL 8.0中删除。

2.3.3 分析器

因为客户端发送过来的只是一段文本字符串,因此MySQL服务器还需要对该文本字符串进行解析,这个解析过程就是在分析器中完成的。分析器对客户端发过来的SQL语句进行分析,包括预处理与解析过程,在这个阶段会解析SQL语句的语义,并进行关键词和非关键词进行提取、解析,并创建一个内部数据结果(解析树)。具体的关键词包括不限定于以下:select/update/delete/or/in/where/group by/having/count/limit等。如果分析到语法错误,会直接给客户端抛出异常:ERROR:You have an error in your SQL syntax.。除了提取关键词外,还会对其中的表进行校验,如果不存在该表,同样也会报错:unknown column in field list.。通过了分析器,那么就说明客户端发送过来的文本字符串是符合SQL标准语义规则,之后MySQL服务器就要开始执行SQL语句了。

2.3.4 优化器

优化器不仅会生成SQL执行的计划,还会帮助优化SQL语句。如外连接转换为内连接、表达式简化、子查询转为连接、连接顺序、索引选择等一堆东西,优化的结果就是执行计划。MySQL会计算各个执行方法的最佳时间,最终确定一条执行的SQL交给最后的执行器。

2.3.5 执行器

开始执行SQL的时候,要先判断一下对这个表有没有相应的权限,如果没有,就会返回权限错误。如果权限校验通过后,会调用存储引擎的API,API会调用存储引擎(存储引擎API只是抽象接口,下面还有个存储引擎层,具体实现还是要看表选择的存储引擎),主要有以下存储的引擎(常用的还是myisam和innodb):

存储引擎myisaminnodbmemoryarchive
存储限制256TB64TB
事务/支持//
索引支持支持支持/
锁的粒度表锁行锁表锁行锁
数据压缩支持//支持
外键/支持//

存储引擎,之前又叫表处理器,负责对具体的数据文件进行操作,对SQL的语义比如select或者update进行分析,执行具体的操作。在执行完以后会将具体的操作记录到binlog中,需要注意的一点是:select不会记录到binlog中,只有update/delete/insert才会记录到binlog中。而update会采用两阶段提交的方式,记录都redolog中。

关于binlog和redolog两个日志的说明:

binlog:

  • 作用:Binlog记录了对MySQL数据库进行的所有更改操作,例如INSERT、UPDATE、DELETE等,以二进制格式记录在磁盘上。
  • 功能:主要用于数据恢复、数据复制和数据迁移。通过分析Binlog,可以重放数据库中的更改操作,从而实现数据的恢复或者将更改操作应用到其他MySQL实例上。
  • 使用场景:常用于数据库备份、故障恢复、数据同步等场景。

redolog:

  • 作用:Redo Log记录了数据库引擎执行的每个事务的修改操作,以便在数据库发生崩溃时,可以通过重放Redo Log来恢复事务的更改。
  • 功能:主要用于保证数据库的持久性和事务的原子性,即使在发生故障时也能确保事务的完整性。
  • 使用场景:主要用于崩溃恢复和事务回滚。

三、SQL执行顺序说明

SQL并不是按照我们的书写顺序来从前往后、左往右依次执行的,它是按照固定的顺序解析的,主要的作用就是从上一个阶段的执行返回结果来提供给下一阶段使用,SQL在执行的过程中会有不同的临时中间表,一般是按照如下顺序:

  • from
  • on
  • join
  • where
  • goup by
  • having + 聚合函数
  • select
  • order by
  • limit

在MySQL中,查询语句中子查询的执行顺序可以根据具体情况而有所不同,但一般来说,以下是一个常见的执行顺序:

  • 内部子查询:MySQL通常会首先执行子查询,生成临时结果集,然后将其用于外部查询。内部子查询是指嵌套在主查询中的子查询,通常作为主查询的一部分。
  • 关联子查询:如果子查询是一个关联子查询(即与外部查询相关联),MySQL可能会根据优化器的策略选择在何处执行子查询。有时候,MySQL可能会将关联子查询转换为连接查询来提高性能。
  • 外部查询:一旦子查询的结果可用,MySQL会将其与外部查询组合起来执行,产生最终的结果集。

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

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

相关文章

Project Euler_Problem 159_Digital Root Sums of Factorisations

原题目&#xff1a; 解题思路&#xff1a; 代码&#xff1a; void solve() {ll i, j,k,x,y,z,p,q,u,v;N 1000000, NN 1024;//N 20;double a, b, c,d;M.NT.get_prime_Euler(2000000);for (i 2; i < N; i) {x (i-1)%91;for (j 2; j<sqrt(i); j) {if (i % j 0) {x …

宝妈如何在家创造收入?五种兼职工作让你轻松赚钱!

许多宝妈为了陪伴孩子成长&#xff0c;毅然选择了全职妈妈的角色&#xff0c;然而&#xff0c;她们内心仍希望能有一份收入&#xff0c;实现经济独立。于是&#xff0c;寻找既能照顾家庭又能赚钱的工作成了她们的迫切需求。 然而&#xff0c;这样的需求也往往让宝妈们成为一些…

Linux三剑客-sed、awk、egrep(上)

一、知识梗概 二、正则表达式 定义&#xff1a;正则表达式是一种强大的文本处理工具&#xff0c;用于在文本中搜索符合特定模式的字符串。它由一系列特殊字符和普通字符组成&#xff0c;可以定义复杂的搜索模式。正则表达式被广泛应用于各种编程语言和文本处理工具中。 简单来…

antDesignVue 使用-持续更新

背景 vue3viteantdesignvuevue-router 1,全局完整注册 1.1下载antdesignvue npm i --save ant-design-vue 或者 npm install ant-design-vuenext --save 1.2在mian.ts中引入 import { createApp } from vue import { createPinia } from piniaimport App from ./App.vue …

微信跳转页面时发生报错

报错如下图所示&#xff1a; 解决方法&#xff1a;&#xff08;从下面四种跳转方式中任选一种&#xff0c;哪种能实现效果就用哪个&#xff09; 带历史回退 wx.navigateTo() //不能跳转到tabbar页面 不带历史回退 wx.redirectTo() //跳转到另一个页面wx.switchTab() //只能…

读书笔记:高效能人士的七个习惯

前言 恐惧感和不安全感 现代社会&#xff0c;太多的人饱受恐惧感的折磨。他们恐惧将来&#xff0c;恐惧失业&#xff0c;恐惧无力养家。这种弱点&#xff0c;常常助长了一种倾向&#xff1a;无论在工作时&#xff0c;还是回到家中&#xff0c;都倾向于零风险的生活&#xff0…

MathType2024中文网站7.9最新版本数学公式编辑器下载

MathType是一款专业的数学公式编辑器&#xff0c;由Design Science公司开发。它为用户提供了一个便捷的方式来创建和编辑复杂的数学公式&#xff0c;适用于各种文档和出版物。MathType与常见的文字处理软件和演示程序配合使用&#xff0c;能够在各种文档中加入复杂的数学公式&a…

【MYSQL】MySQL整体结构

无论你是前端还是后端&#xff0c;只要是一个合格的开发者&#xff0c;对于MySQL这个名词相信都不陌生&#xff0c;MySQL逐渐成为了最受欢迎的关系型数据库&#xff0c;无论你是大前端&#xff0c;亦或是Java、Go、Python、C/C、PHP....等这些语言的程序员&#xff0c;对于MySQ…

vulhub靶场shiro系列漏洞复现CVE-2010-3863、CVE-2016-4437(shiro550)、CVE-2020-1957、shiro721

目录 shiro简介 shiro漏洞成因 shiro550 shiro721 利用过程 CVE-2010-3863&#xff08;未授权访问&#xff09; 简介 CVE-2016-4437(shiro550) 简介 CVE-2020-1957&#xff08;未授权访问&#xff09; 漏洞影响 简介 url处理过程 shiro721 影响版本 简介 利用 …

ON1 NoNoise AI 2024 for Mac/Win:智能降噪,重塑影像之美

在数字摄影领域&#xff0c;图片质量往往受到多种因素的影响&#xff0c;其中噪点问题尤为突出。ON1 NoNoise AI 2024作为一款专为Mac和Windows平台打造的AI图片降噪工具&#xff0c;凭借其卓越的降噪性能和智能化的操作体验&#xff0c;成为了摄影师和图像处理专家们的首选工具…

bugku-web-decrypt

这里的提示解密后没有什么意义 这里下载文件包 得到一个index.php文件 得到代码 <?php function encrypt($data,$key) {$key md5(ISCC);$x 0;$len strlen($data);$klen strlen($key);for ($i0; $i < $len; $i) { if ($x $klen){$x 0;}$char . $key[$x];$x1;}for…

2023androidstudio

终于下定决心将studio升级到新版本使用了&#xff0c;在这总结下和之前的差别 问题一&#xff1a; 创建java类型的项目 在新版本studio中&#xff0c;创建android项目时&#xff0c;语言选择中没有java选项了&#xff0c;这让一直使用java开发的我摸索了好久&#xff0c;终于…

Qt QProcess详解

1.简介 QProcess提供了在 Qt 应用程序中启动外部程序的方法。通过QProcess&#xff0c;你可以启动一个进程&#xff0c;与它通信&#xff08;发送输入和读取输出&#xff09;&#xff0c;检查它的状态&#xff0c;以及等待它完成。这个类在执行系统命令、运行其他程序或脚本时…

AI大模型探索之路-应用篇11:AI大模型应用智能评估(Ragas)

目录 前言 一、为什么要做智能评估&#xff1f; 二、Ragas是什么&#xff1f; 三、Ragas使用场景 四、Ragas评估指标 五、Ragas代码实践 总结 前言 随着人工智能技术的飞速发展&#xff0c;AI大模型&#xff08;LLM&#xff09;已经成为了推动技术创新和应用的关键因素。…

深入理解信号上升沿与带宽的关系

信号的上升时间&#xff0c;对于理解信号完整性问题至关重要&#xff0c;高速pcb设计中的绝大多数问题都和它有关&#xff0c;很多信号完整性问题都是由信号上升时间短引起的&#xff0c;你必须对他足够重视。 信号上升时间并不是信号从低电平上升到高电平所经历的时间&#xf…

连接两部VR头显的type-c DP分配器方案,可以给主机设备PD反向供电与两部VR同时供电。

随着type-c的发展&#xff0c;目前越来越多的设备都在使用type-c作为连接的接口&#xff0c; 不仅是笔记本与手机在使用现在的游戏主机如&#xff08;任天堂&#xff0c;steam&#xff0c;&#xff09;或者是VR的一体机或者是VR头显也都在使用type-c作为连接接口。 type-c接口…

传统图机器学习的特征工程-全图

将整张图表示成为一个低维向量&#xff0c;反映全图的特征 key idea&#xff1a;Bag-of-Words&#xff08;BOW&#xff09;把图看作文章&#xff0c;把节点看作单词 Kernel mothods

FL Studio808鼓音在哪 FL Studio怎么让音乐鼓点更有力 FL Studio教程

FL Studio808鼓音在哪&#xff1f;808是一款电鼓机的名称&#xff0c;它发出的声音也被称之为808鼓&#xff0c;通常我们可以安装鼓机插件来使用&#xff0c;但FL Studio中自带的也有808鼓的采样音频。FL Studio怎么让音乐鼓点更有力&#xff1f;让鼓点更有力要从EQ均衡器、压缩…

ELK日志分析系统(上)

目录 引言 一、ELK日志分析系统简介 1.1 日志服务器 1.2 ELK日志分析系统的组成 1.3 日志处理步骤 二、Elasticsearch介绍 2.1 概述 2.2 核心概念 三、Logstash介绍 3.1 概述 3.2 主要组件 四、Kibana介绍 4.1 概述 4.2 主要功能 五、ELK的工作原理 六、部署ELK…

LINUX系统编程:缓冲区

1.为什么要有缓冲区 缓冲区分成语言层面的缓冲区和操作系统层面的缓冲区 先说结论&#xff0c;语言的缓冲区可以减少系统调用的次数进而提高向文件写入和读取的效率。 2.举例子 向屏幕打印&#xff0c;无非就是向屏幕这个文件的缓冲区写入&#xff0c;然后在由操作系统刷新…