搞懂 MySql 的架构和执行流程

news2024/11/28 2:51:47

搞懂 MySql 的架构和执行流程

  • 1、MySQL 的三层架构
  • 2、SQL 的执行流程
    • 2.1、连接器
    • 2.2、解析器
    • 2.3、预处理器
    • 2.4、优化器
    • 2.5、执行器
    • 2.6、存储引擎
  • 3、关于Select 的两个顺序

 

1、MySQL 的三层架构

 
MySQL的三层结构包括:

  1. 连接层:负责与MySQL客户端之间的通信,提供如连接处理,身份验证等功能。
  2. 服务层:在MySQL数据库系统处理底层数据之前的所有工作,都是在服务层完成的。包括权限判断,SQL 解析,行计划优化,query cache的处理以及所有内置的函数(如日期,时间,数学运算,加密)等等。
  3. 引擎层:负责存储和获取所有存储在MySQL中的数据。

 

2、SQL 的执行流程

 
在这里插入图片描述
查询缓存 在5.7版本和之前的版本存在,由于命中率较低,比较鸡肋等原因,5.8版本已经不存在了,这里就不过多讨论 查询缓存。
 

2.1、连接器

 
连接器:尝试连接MySql,建立连接。
客户端访问 MySQL 服务器之前,首先会建立 TCP 连接,经过三次握手建立连接成功后, MySQL 服务器对 TCP 传输过来的账号密码做身份认证和权限获取。

  • 用户名或密码不对,会收到一个 Access denied for user 错误,客户端程序结束执行。
  • 用户名密码认证通过,会从权限表查询账号拥有的权限与连接关联,之后的权限判断逻辑,都将依赖于此时读到的权限。
  • 多个客户端可以和一个MySQL服务器建立连接,每个客户端和一个MySQL服务器可以建立多个连接。MySQL 服务器里有专门的 TCP连接池限制连接数,采用长连接模式复用TCP连接

 

2.2、解析器

 
解析器:解析Sql语句,会把一条sql语句解析语法树。(包含词法解析和语法解析)

  • 在解析器中对 SQL 语句进行语法分析、词法分析。将 SQL 语句分解成数据结构,并将这个结构传递到后续步骤,以后 SQL 语句的传递和处理就是基于这个结构。如果在分解构成中遇到错误,那么就说明这个 SQL 语句是不合理的。
  • 在 SQL 命令传递到解析器的时候,会被解析器验证和解析,并为其创建语法树,并根据数据字典丰富查询语法树,会验证该客户端是否具有执行该查询的权限。创建好语法树后,MySQL 还会对 SQL 查询进行语法上的优化,进行查询重写。

在这里插入图片描述

 

2.3、预处理器

 
       预处理器的任务根据MySQL的相关规则对解析器生成的SQL语句解析树进行进一步的校验和处理。包括检查数据库中的数据表、数据列是否存在,并对别名进行校验,检查别名是否存在重名和歧义等情况。

       预处理器的目的是确保SQL语句的合法性和正确性,以及优化查询性能。通过预处理操作,可以避免在查询执行过程中出现错误,提高查询的效率和稳定性。

 

2.4、优化器

 

在这里插入图片描述

一条查询可以有很多种执行方式,最后都会返回相同的结果。优化器的作用就是找到这其中最好的执行计划

  • SQL 语句在语法解析之后、查询之前会使用查询优化器确定 SQL 语句的执行路径,生成一个 执行计划.

  • 这个执行计划表明应该使用哪些索引进行查询(全表检索还是使用索引检索),表之间的连接顺序如何,最后会按执行计划中的步骤,调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户。

  • 它使用 选取-投影-连接策略进行查询。例如:

    SELECT id,name,age FROM tb_user WHERE gender = '男';
    -- 该查询语句先根据 WHERE 进行选取,而不是将表全部查询出来以后再进行 gender 过滤。
    -- 同时,该查询语句先根据 id,name,age 进行属性投影,而不是将属性全部取出后再进行过滤,将这两个查询条件 连接 起来,生成最终的结果。
    

查询优化器,分为逻辑查询优化阶段、物理查询优化阶段。

  • 逻辑查询优化:通过改变 SQL 语句的内容来使得 SQL 查询更高效,同时为物理查询优化提供更多的候选执行计划。通常采用的方式是对 SQL 语句进行 等价变换,对查询进行 重写,而查询重写的数学基础就是关系代数。对条件表达式进行等价谓词重写、条件简化、对视图进行重写,对子查询进行优化,对连接语义进行了外连接消除、嵌套连接消除等。
  • 物理查询优化:基于关系代数进行的查询重写,而关系代数的每一步都对应着物理计算,这些物理计算往往存在多种算法,因此需要计算各种物理路径的代价,从中选择代价最小的作为执行计划。在这个阶段中,对于单表和多表连接的操作,需要高效地使用索引,提升查询效率。

 

2.5、执行器

 
执行器,负责根据优化器生成的执行计划,执行SQL语句,并返回结果集。其主要功能包括:

  • 与存储引擎交互:执行器通过调用存储引擎的API来操作数据,执行查询、更新、插入等操作。不同的存储引擎有不同的接口和实现方式,执行器需要与存储引擎紧密配合,确保数据操作的正确性和高效性。

  • 权限校验:在执行SQL语句之前,执行器会进行权限校验,确保当前用户有权执行该语句。如果权限不足,执行器会返回相应的错误信息。

  • 执行计划执行:根据优化器生成的执行计划,执行器会按照计划逐步执行SQL语句,访问相关的数据表,执行相应的操作,并生成结果集。

 

2.6、存储引擎

 
存储引擎层,负责了 MySQL 中数据的存储和提取,对物理服务器级别维护的底层数据执行操作,服务器通过 API 与存储引擎进行通信。不同的存储引擎具有不同的功能,由此使用者可以根据自己的实际需求进行存储引擎的选取。

 

3、关于Select 的两个顺序

 
关键字的顺序不能颠倒

SELECTFROMWHEREGROUP BYHAVINGORDER BYLIMIT

 
SELECT 语句的执行顺序

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT 的字段 -> DISTINCT -> ORDER BY -> LIMIT
  1. FROM:首先,MySQL会根据FROM子句找到需要查询的表。
  2. JOIN:接着,如果有JOIN操作,MySQL会根据JOIN类型(如INNER JOIN、LEFT JOIN等)和其他JOIN条件,将多个表连接在一起。
  3. WHERE:然后,MySQL会对连接后的表应用WHERE子句中的过滤条件,筛选出满足条件的记录。
  4. GROUP BY:如果有GROUP BY子句,MySQL会按照指定的列进行分组。
  5. HAVING:接着,MySQL会对分组后的结果应用HAVING子句中的过滤条件,进一步筛选分组。
  6. SELECT:然后,MySQL会对筛选后的记录应用SELECT子句,选择需要的列。
  7. DISTINCT:如果使用了DISTINCT关键字,MySQL会去除选择列中的重复值。
  8. ORDER BY:如果有ORDER BY子句,MySQL会按照指定的列进行排序,返回结果集。
  9. LIMIT:最后,如果使用了LIMIT子句,MySQL会限制返回的数据行数。
  10. 以上是MySQL中SELECT语句的一般执行顺序,具体执行过程可能会因为查询优化和其他因素而有所变化。
     
# 举例:
SELECT DISTINCT <select_list>
FROM <left_table> <join_type>
JOIN <right_table> ON <join_condition>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
ORDER BY <order_by_condition>
LIMIT <limit_number>

# 执行顺序如下

1   FROM <left_table>
2   ON <join_condition>
3   <join_type> JOIN <right_table>
4   WHERE <where_condition>
5   GROUP BY <group_by_list>
6   HAVING <having_condition>
7   SELECT
8   DISTINCT <select_list>
9   ORDER BY <order_by_condition>
10  LIMIT <limit_number>

-- 举例说明
SELECT DISTINCT id,name,count(*) as num  # 顺序5 
FROM tb_users u inner join tb_team t on u.team_id = t.id  # 顺序1 
WHERE u.age > 18   # 顺序2 
GROUP BY t.id      # 顺序3
HAVING num > 2     # 顺序4
ORDER BY num DESC  # 顺序6
LIMIT 3    # 顺序7

       在 SELECT 语句执行的步骤中,每一个步骤都会产生一个 虚拟表,然后将这个虚拟表传入下一个步骤中作为输入。上面这些执行步骤都隐含在 SQL 的执行过程中,对于我们是不可见的。
 
 
 
 
 
 
 
.

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

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

相关文章

ChatGPT从入门到精通

目录 什么是ChatGPT&#xff1f;ChatGPT能帮我干什么&#xff1f;标题在哪里可以使用ChatGPT&#xff1f;什么是ILoveChatGPT&#xff08;IMYAI&#xff09;&#xff1f;标题如何拥有头像&#xff1f;如何获取更多对话次数&#xff1f;!标题如何提问GPT&#xff1f;如何正确地利…

【C++的OpenCV】第十四课-OpenCV基础强化(二):访问单通道Mat中的值

&#x1f389;&#x1f389;&#x1f389; 欢迎各位来到小白 p i a o 的学习空间&#xff01; \color{red}{欢迎各位来到小白piao的学习空间&#xff01;} 欢迎各位来到小白piao的学习空间&#xff01;&#x1f389;&#x1f389;&#x1f389; &#x1f496;&#x1f496;&…

C++——类和对象(上)

1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 例如手洗衣服 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间…

如何借助数据集更好的评估NLP模型的性能?

随着信息时代的迅猛发展&#xff0c;每天有无数文本、声音、图片和视频不断涌入互联网。如何从海量数据中提炼有意义信息成为学术界和工业界迫切需要解决的问题。在此背景下&#xff0c;自然语言处理&#xff08;NLP&#xff09;应运而生&#xff0c;成为人工智能领域最为活跃的…

python基础语法(十一)

目录 文件文件是什么文件路径文件操作1. 打开文件关闭文件写文件读文件 关于中文的处理使用上下文管理器 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412;个人主页 &#x1f978;&#x1f978;&#x1f978;C语言 &…

串行原理编程,中文编程工具中的串行构件,串行连接操作简单

串行通信原理编程&#xff0c;中文编程工具中的串行通信构件&#xff0c;串行通信连接设置简单 编程系统化课程总目录及明细&#xff0c;点击进入了解详情。https://blog.csdn.net/qq_29129627/article/details/134073098?spm1001.2014.3001.5502 串行端口 是串行的基础&#…

第22天:time模块与datetime模块

time模块 时间的三种格式&#xff1a; 1. 时间戳&#xff1a;从1970年1月1号到现在的秒数&#xff0c;他是一个数字 2. 结构化时间: 不是让我们看的&#xff0c;让计算机看的&#xff0c;他是时间之间相互转换的时候的中间桥梁 3. 格式化时间&#xff1a;就是符…

【贝叶斯回归】【第 1 部分】--pyro库应用

Bayesian Regression - Introduction (Part 1) — Pyro Tutorials 1.8.6 documentation 一、说明 我们很熟悉线性回归的问题&#xff0c;然而&#xff0c;一些问题看似不似线性问题&#xff0c;但是&#xff0c;用贝叶斯回归却可以解决。本文使用土地平整度和国家GDP的关系数据…

栈、共享栈、链式栈(C++实现)

文章目录 前言1. 栈的顺序存储&#xff08;顺序栈&#xff09;2. 栈的基本操作&#x1f351; 入栈操作&#x1f351; 出栈操作&#x1f351; 获取栈顶元素&#x1f351; 获取栈的长度&#x1f351; 判断是否为空栈&#x1f351; 判断栈是否满了&#x1f351; 打印栈内的元素&am…

『VUE2 - 车牌号软键盘』

一、需求描述 在 VUE2 Vant2 的项目中&#xff0c;实现 车牌号软键盘 的功能。 二、引入全局组件 引入封装好的 vant-number-plate 组件&#xff0c;整个文件夹放在 src/components 里面&#xff1a; git clone https://gitee.com/csheng-gitee/vant-number-plate.git三、具…

IMYAI-人工智能聊天绘画机器人4.0 - 终身学习者的超级生产力工具!

什么是ChatGPT&#xff1f;ChatGPT能帮我干什么&#xff1f; 在开始之前&#xff0c;我们首先需要知道ChatGPT是什么。 ChatGPT 全名Chat Generative Pre-trained Transformer (聊天生成性预训练转换模型) 说简单点&#xff0c;ChatGPT就是一个AI聊天机器人&#xff0c;背后是一…

Redis(08)| 线程模型

一、redis 的线程模型 redis 内部使用文件事件处理器 file event handler&#xff0c;它是单线程的&#xff0c;所以redis才叫做单线程模型。它采用IO多路复用机制同时监听多个 socket&#xff0c;将产生事件的 socket 压入内存队列中&#xff0c;事件分派器根据 socket 上的事…

Vue3.3指北(四)

Vue3.3指北 1、WebPack - VueCLI1.1、WebPack安装VueCli1.2、vue create 创建项目1.3、项目目录结构介绍 2、ViteVue32.1、认识create-vue2.2、使用create-vue创建项目2.3、项目目录剖析2.4、ESlint代码规范及手动修复2.5、通过eslint插件来实现自动修正 3、VueRouter43.1、单页…

SpringCloud 微服务全栈体系(七)

第九章 Docker 一、什么是 Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署&#xff0c;环境不一定一致…

基于SpringBoot的个人博客系统

基于SpringBootVue的个人博客系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 系统公告 博客详情 后台发文 摘要 基于Spring Boot的个人博客系统是一种…

实用搜索小技巧——站在巨人的肩膀上看世界

文章目录 1. 关于搜索效率2. 谷歌搜索语法2.1 “” 限定关键词2.2 intitle 限定标题2.3 限定关键词限定标题2.4 allintitle 标题多个关键词2.5 intext 限定内容关键词2.6 inurl 限定网址关键词2.7 site 限定网址来源2.8 imagesize 限定图片尺寸2.9 filetype 限定文件格式 3. in…

8.自定义组件布局和详解Context上下文

pages/index.vue layout布局运行在服务端 1、在项目的目录下新建layout文件夹&#xff0c;并新建一个blog.vue布局文件 2、在页面中的layout函数里&#xff0c;返回刚才新建布局文件的名字blog就可以使用了 export default {...layout (context) {console.log(context)retu…

探索Vue 3和Vue 2的区别

目录 响应式系统 性能优化 Composition API TypeScript支持 总结 Vue.js是一款流行的JavaScript框架&#xff0c;用于构建用户界面。Vue 3是Vue.js的最新版本&#xff0c;相较于Vue 2引入了许多重大变化和改进。在本文中&#xff0c;我们将探索Vue 3和Vue 2之间的区别。 …

【中国知名企业高管团队】系列50:荣耀手机

今天为您介绍中国手机的一个“新势力”——荣耀。说是“新”是因为他单独运作的时间最短&#xff0c;说他“势力”是因为他的崛起自带光环&#xff0c;市场拓展和发展让OPPO、VIVO和小米都感到巨大的压力&#xff0c;可以说中国市场的大部分份额都被苹果、华为、OPPO、VIVO、小…

图解java.util.concurrent并发包源码系列——深入理解ConcurrentHashMap并发容器,看完薪水涨一千

图解java.util.concurrent并发包源码系列——深入理解ConcurrentHashMap并发容器 HashMap简单介绍HashMap在并发场景下的问题HashMap在并发场景下的替代方案ConcurrentHashMap如何在线程安全的前提下提升并发度1.71.8 JDK1.7的ConcurrentHashMap源码JDK1.8的ConcurrentHashMap源…