为了执行SQL语句,MySQL的架构是怎样设计的

1. 把MySQL当个黑盒子一样执行SQL语句

上一讲我们已经说到,我们的系统采用数据库连接池的方式去并发访问数据库,然后数据库自己其实也会维护一个连 接池,其中管理了各种系统跟这台数据库服务器建立的所有连接

我们先看下图回顾一下

当我们的系统只要能从数据库连接池获取到一个数据库连接之后,我们就可以执行增删改查的SQL 语句了

从上图其实我们就可以看到,我们可以通过数据库连接把要执行的SQL语句发送给MVSQL数据库

然后呢?大部分同学了解到这个程度就停下来了,然后大家觉得要关注的可能主要就是数据库里的表结构,建了哪些索引,然后就按照SQL语法去编写增删改查SQL语句,把MVSQL当个黑盒子去执行SQL语句就可以了。

我们只知道执行了inset语句之后,在表里会多出来一条数据;执行了update语句之后,会对表里的数据进行更改;执 行了delete语句之后,会把表里的一条数据删除掉;执行了select语句之后,会从表里查询一些数据出来

如果语句性能有点差?没关系,在表里建几个索引就可以了!可能这就是目前行业内很多工程师对数据库的一个认知,完全当他是个黑盒子,来建表以及执行SQL语句。

但是大家既然跟着我开始学习了,从现在开始就要打破这种把数据库当黑盒子的认知程度,要深入底层,去探索数据 库的工作原理以及生产问题的优化手段!

2. 一个不变的原则:

现在假设我们的数据库服务器的连接池中的某个连接接收到了网络请求,假设就是一条SQL 语句,那么大家先思考一 个问题,谁负责从这个连接中去监听网络请求?谁负责从网络连接里把请求数据读取出来?

我想很多人恐怕都没思考过这个问题,但是如果大家对计算机基础知识有一个简单了解的话,应该或多或少知道-点,那就是网络连接必须得分配给一个线程去进行处理,由一个线程来监听请求以及读取请求数据,比如从网络连接 中读取和解析出来一条我们的系统发送过去的SQL语句,如下图所示:

3. 接口负责处理接收到的SQL语句

接着我们来思考一下,当MySQL内部的工作线程从一个网络连接中读取出来一个SQL语句之后,此时会如何来执行这个SQL语句呢?

其实SQL是一项伟大的发明,他发明了简单易用的数据读写的语法和模型,哪怕是个产品经理,或者是运营专员,甚 至是销售专员,即使他不会技术,他也能轻松学会使用SQL语句。

但如果你要去执行这个SQL语句,去完成底层数据的增删改查,那这就是一项极度复杂的任务了!

所以MySQL内部首先提供了一个组件,就是SQL接口(SQL Interface),他是一套执行SQL语句的接口,专门用于执行我们发送给MySQL的那些增删改查的SQL语句

因此MySQL的工作线程接收到SQL语句之后,就会转交给SQL接口去执行,

如下图

4. 查询解析器:让MySQL语句进行解析

接着下一个问题来了,SQL 接口怎么执行SQL语句呢?你直接把SQL语句交给MySQL,他能看懂和理解这些SQL语句吗?

比如我们来举一个例子,现在我们有这么一个SQL语句:

select id,name,age from users where id=1

这个SQL语句,我们用人脑是直接就可以处理一下,只要懂SQL语法的人,立马大家就知道他是什么意思,但是MVSQL自己本身也是一个系统,是一个数据库管理系统,他没法直接理解这些SQL语句!

所以此时有一个关键的组件要出场了,那就是查询解析器

这个查询解析器 (Parser) 就是负责对SQL语句进行解析的,比如对上面那个SQL语句进行一下拆解,拆解成以下几个部分:

1.我们现在要从“users”表裏查询数据

2.查询”id”字段的值等于1的那行数据

3.对查出来的那行数据要提取里面的“id,name,age”叁个字段

所谓的SQL解析,就是按照既定的SQL语法,对我们按照SQL语法规则编写的SQL语句进行解析,然后理解这个SQL语句要干什么事情,如下图所示:

5. 查询优化器:选择最优的查询路径

当我们通过解析器理解了SQL语句要干什么之后,接着会找査询优化器(0ptimizer)来选择一个最优的查询路径。

可能有同学这里就不太理解什么是最优的查询路径了,这个看起来确实很抽象,当然,这个查询优化器的工作原理,后续将会是我们分析的重点,大家现在不用去纠结他的原理。

但是我们可以用一个极为通俗简單的例子,让大家理解一下所謂的最优查询路径是什么。

就用我们刚才講的那个例子好了,我们现在理解了一个SQL想要干这么一个事儿:我們现在要從users ”表里查询数 据,查询id”字段的值等于1的那行数据,對查出来的那行数據要提取里面的”id,name,age”三个字段。

事是明白了,但是到底应该怎么来实现呢?

你看,要完成這个事儿我们有以下幾個查询路径(纯属用于大家理解的例子,不代表真实的MVSQL原理,但是通过这个例子,大家肯定能理解所谓最优查詢路径的意思):

1.直接定位到'users”表中的id”字段等于1的一行数据,然后查出来那行数据的id,name,age”三个字段的值就可以了

2.先把'users”表中的每一行数据的id,name,age”叁个字段的值都查出来,然后从这批数据裏过滤出来id字段等于1的那行数据的id,name,age”三个字段

上面这就是一个最简单的SQL语句的两種实现路径,其实我们会发现,要完成这个SQL语句的目标,兩个路径都可以做到,但是哪一种更好呢?显然感觉上是第一种查询路径更好一些。

所以查询优化器大概就是干这个的,他会針对你编写的幾十行、幾百行甚至上千行的复雜SQL语句生成查询路径树,

然后从里面选择一条最优的查询路径出来

相当于他会告诉你,你应该按照一个什么样的步骡和顺序,去执行哪些操作,然后一步一步的把SQL语句就合完

我们来一起看看下面的图:

6. 调用存储引擎接口,真正执行SQL语句

最后一步,就是把查询优化器选择的最优查询路径,也就是你到底应该按照一个什么样的顺序和步去执行这个SOL语句的计划,把这个计划交给底层的存儲引警去真正的执行。这个存储引擎是MVSOL的架构设計中很有特色的一个环节。

不知道大家是否思考过,真正在执行SQL语句的时候,要不然是更新数据,要不然是查询数据,那么数据你觉得存放在哪里?

说白了,数据库也不是什么神秘莫测的东西,你可以把他理解为本身就是一个类似你平时写的图书馆管理系统电信计费系统、电商订单系统之类的系统罢了,

数据库自己就是一个编程语言写出来的系统而已,然后启动之后也是一个进程,执行他里面的各种代码,也就是我们 上面所说的那些东西。所以对数据库而言,我们的数据要不然是放在内存里,要不然是放在磁盘文件里,没什么特殊的地方!

所以我们来思考一下,假设我们的数据有的存放在内存里,有的存放在磁盘文件里,如下图所示,

那么现在问题来了,我们已经知道一个SQL语句要如何执行了,但是我们现在怎么知道哪些数据在内存里?哪些数据 在磁盘里?我们执行的时候是更新内存的数据?还是更新磁盘的数据?我们如果更新磁盘的数据,是先查询哪个磁盘 文件,再更新哪个磁盘文件?

是不是感觉一头雾水

所以这个时候就需要存储引擎了,存储引擎其实就是执行SQL语句的,他会按照一定的步骤去查询内存缓存数据,更 新磁盘数据,查询磁盘数据、等等,执行诸如此类的一系列的操作,如下图所示。

MySQL的架构设计中,SQL接口、SQL解析器、查询优化器其实都是通用的,他就是一套组件而已

但是存储引擎的话,他是支持各种各样的存储引擎的,比如我们常见的InnoDB、MYISAM、Memory等等,我们是可以 选择使用哪种存储引擎来负责具体的SQL语句执行的。

当然现在MVSOL一般都是使用InnoDB存储引擎的,至干存储引警的原理,后续我们也会深入一步一步分析,大家不必 着急。

7. 执行器:根据执行计划调用存储引擎的接口

那么看完存储引擎之后,我们回过头来思考一个问题,存储引引擎可以帮助我们去访问内存以及磁盘上的数据那么是谁来调用存储引擎的接口呢?

其实我们现在还漏了一个执行器的概念,这个执行器会根据优化器选择的执行方案,去调用存储引擎的接口按照一定的顺序和步骤,就把SQL语句的逻辑给执行了。

举个例子,比如执行器可能会先调用存储引擎的一个接口,去获取users”表中的第一行数据,然后判断一下这个数据 的“id”字段的值是否等于我们期望的一个值,如果不是的话,那就继续调用存储引擎的接口,去获取“users”表的下一行数据。

就是基于上述的思路,执行器就会去根据我们的优化器生成的一套执行计划,然后不停的调用存储引擎的各种接口去完成SQL语句的执行计划,大致就是不停的更新或者提取一些数据出来

我们看下图的示意

8. 小思考题:打开脑洞,你觉得不同的存储引擎是用来干什么的?

今天给大家留一个小的思考题,就是你先别管MySQL有哪些存储引擎,你就从业务场景来出发考虑,有的场景可能是 高并发的更新,有的场景可能是大规模数据查询,有的场景可能是允许丢失数据的

那么你觉得如果让你来设计存储引擎,你觉得应该有哪些存储引擎,分别适用于什么场景?

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

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

相关文章

WordPress用户福音:Elementor Pro国产版替代方案,全新中文界面更懂你

如果你正在考虑创建自己的网站,那么在第一次谷歌搜索时,你可能已经看到了WordPress、Elementor和网站构建器这些专业名称。WordPress是最受欢迎的网站平台之一,这不难理解:它高度可定制,易于学习,而且是免费…

第十五届蓝桥杯 javaB组第三题

测试通过了90% 剩下10%不知道哪错了 思路:我想的是用map,k存第几个队列,value存每个子队列的长度,最后给value排序 第一个就最小的也就是是有效元素数量 考试只对了个案例,其它情况没测试。 复盘 回来后经过修改改…

3.00 版本来了!DolphinDB V2.00.12 V3.00.0 正式发布!

一文带你了解 DolphinDB 全新版本升级! 本次更新后,3.00.0版本将成为 DolphinDB 的最新版,2.00.12版本变更为稳定版,此前发布的1.30.23版本将成为1.30系列的最后一个版本。接下来,带大家一起看看 DolphinDB V2.00.12 …

Android Studio通过修改文件gradle-wrapper.properties内容下载gradle

一、问题描述 在Android Studio中新建项目后会下载你所新建的项目的activity/gradle/wrapper目录下所配置的gradle-7.3.3-bin.zip包(笔者的是该版本包),而大多数时候会下载失败,如下 二、解决办法 新建工程后,取消下…

使用 Fn Project 搭建无服务平台

目录 下载 脚本直接下载 下载可执行文件 上传 启动 Fn 服务 初始化 Fn 工程 创建 app 部署 function 调用 function JSON 入参 官方文档 下载 有两种下载方式 脚本直接下载 直接在服务器执行该命令即可 curl -LSs https://raw.githubusercontent.com/fnproject/…

10、【代理模式】通过引入一个代理对象来控制对原始对象的访问的方式。

你好,我是程序员雪球。 今天我们了解代理模式的原理、静态代理和动态代理的区别、Spring AOP 和动态代理的关系、代理模式的使用场景,以及用 Java 实现一个动态代理示例 一、代理模式的原理 代理模式是一种设计模式,它提供了一种通过引入一个…

【十一】MyBatis Plus 原理分析

MyBatis Plus 原理分析 摘要 Java EE开发中必不可少ORM框架,目前行业里最流行的orm框架非Mybatis莫属了,而Mybatis框架本身没有提供api实现,所以市面上推出了Mybatis plus系列框架,plus版是mybatis增强工具,用于简化My…

量子飞跃:从根本上改变复杂问题的解决方式

内容来源:量子前哨(ID:Qforepost) 编辑丨王珩 编译/排版丨沛贤 深度好文:1000字丨5分钟阅读 利用多功能量子比特的量子计算机已处于解决复杂优化问题的最前沿,例如旅行商问题,这是一个典型的…

虚良SEOPython脚本寄生虫程序源码

本程序,快速收录百度首页,3-5天就可以有流量,长期稳定,可以设置自动推送。 点这里 Python脚本寄生虫程序源码(寄生虫电影脚本) - 虚良SEO 模板可以自己修改,源码带模板标签说明,简…

AI大模型日报#0415:贾佳亚团队新作王炸、马斯克首款多模态大模型、ChatGPT to B

导读: 欢迎阅读《AI大模型日报》,内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。标题: 融合ChatGPTDALLE3,贾佳亚团队新作开源:识图推理生图一站解决 摘要: 贾佳亚团队推出了多模态模型Mini-Gem…

day58 回文子串 最长回文子序列

题目1:647 回文子串 题目链接:647 回文子串 题意 统计字符串s中回文子串的数目 回文子串是正着读和倒过来读一样的字符串 子串是连续字符组成的一个序列 动态规划 动规五部曲 1)dp数组及下标i的含义 dp[i][j] 表示 [s[i]&#xf…

转移插槽简介

4.3.4.转移插槽 我们要将num存储到7004节点,因此需要先看看num的插槽是多少: 如上图所示,num的插槽为2765. 我们可以将0~3000的插槽从7001转移到7004,命令格式如下: 具体命令如下: 建立连接:…

【读书笔记】自动驾驶与机器人中的SLAM技术——高翔

文章会对本书第五章节及以后章节进行总结概括。每日更新一部分。一起读书吧。 第五章——基础点云处理 重点:点云的相邻关系是许多算法的基础 5.1 激光雷达传感器与点云的数学模型 5.1.1激光雷达传感器的数学模型 雷达有两种:机械旋转式激光雷达&…

RocketMQ集群配置

我们集群部署采取采用2m-2s(同步双写)方式,每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功. 1、服务器环境 序号IP角色架构模式1192.16…

一文详解MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM、EAM及其关系

经常遇到很多系统,比如:MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM、EAM,这些都是什么系统?有什么功能和作用?它们之间的关系是怎样的? 今天就一文详细分享给大家。 10大系统之间的关系 ERP 和其他…

深度学习之PyTorch实现卷积神经网络(CNN)

在深度学习领域,卷积神经网络(Convolutional Neural Networks,CNN)是一种非常强大的模型,专门用于处理图像数据。CNN通过卷积操作和池化操作来提取图像中的特征,具有较好的特征学习能力,特别适用…

机器学习算法快速入门

文章目录 0.简介1.常用术语1) 模型2) 数据集3) 样本&特征4) 向量5) 矩阵6)假设函数&损失函数7)拟合&过拟合&欠拟合 2.线性回归3.梯度下降求极值4.Logistic回归算法(分类问题)5.KNN最邻近分类算法6.朴素贝叶斯分类算法7.决策树…

Python调用微信OCR识别文字和坐标

原理 在看雪看到一篇文章:逆向调用QQ截图NT与WeChatOCR-软件逆向。里面说了怎么调用微信和QQ本地的OCR模型,还有很详细的分析过程。 我稍微看了下文章,多的也看不懂。大概流程是使用mmmojo.dll这个dll来与WeChatOCR.exe做通信的&#xff0c…

1688拍立淘接口:图像识别技术引领电商搜索新革命,打造智能购物新体验!

1688拍立淘接口:技术解析与应用实践 一、引言 在电子商务蓬勃发展的今天,图像识别技术正逐渐成为各大电商平台提升用户体验、优化搜索效率的关键技术之一。作为阿里巴巴旗下的B2B采购批发平台,1688也紧跟技术潮流,推出了拍立淘接…

Dos命令的基础

雷迪斯and the乡亲们 欢迎你们来到 奇幻的编程世界 一、DOS命令基础 提示符 根目录:进入大到分区后,最外层的目录就是跟目录 工作目录:当前的所在位置/所在文件夹 二、cd命令 切换工作目录: cd 格式: cd 目标 …