当前位置:网站首页>MySQL底层的逻辑架构
MySQL底层的逻辑架构
2022-07-06 09:10:00 【Eric-x】
1、服务器处理客户端请求
服务器进程对客户端进程发送的请求做了什么处理,才能产生最后的处理结果呢?这里以查询请求为例展示:
下面具体展开看一下
第一层:连接层
系统(客户端)访问 MySQL 服务器前,做的第一件事就是建立 TCP 连接。
经过三次握手建立连接成功后, MySQL 服务器对 TCP 传输过来的账号密码做身份认证、权限获取。
- 用户名或密码不对,会收到一个Access denied for user错误,客户端程序结束执行
- 用户名密码认证通过,会从权限表查出账号拥有的权限与连接关联,之后的权限判断逻辑,都将依赖于此时读到的权限
TCP 连接收到请求后,必须要分配给一个线程专门与这个客户端的交互。所以还会有个线程池,去走后面的流程。每一个连接从线程池中获取线程,省去了创建和销毁线程的开销。
第二层:服务层
SQL Interface: SQL接口
- 接收用户的SQL命令,并且返回用户需要查询的结果。比如SELECT … FROM就是调用SQL Interface
- MySQL支持DML(数据操作语言)、DDL(数据定义语言)、存储过程、视图、触发器、自定义函数等多种SQL语言接口
Parser: 解析器
- 在解析器中对 SQL 语句进行语法分析、语义分析。将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。如果在分解构成中遇到错误,那么就说明这个SQL语句是不合理的。
- 在SQL命令传递到解析器的时候会被解析器验证和解析,并为其创建 语法树 ,并根据数据字典丰富查询语法树,会 验证该客户端是否具有执行该查询的权限 。创建好语法树后,MySQL还会对SQl查询进行语法上的优化,进行查询重写。
Optimizer: 查询优化器
- SQL语句在语法解析之后、查询之前会使用查询优化器确定 SQL 语句的执行路径,生成一个执行计划
- 这个执行计划表明应该 使用哪些索引 进行查询(全表检索还是使用索引检索),表之间的连接顺序如何,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户。
- 它使用“ 选取-投影-连接 ”策略进行查询。例如
SELECT id,name FROM student WHERE gender = '女';
这个SELECT查询先根据WHERE语句进行 选取 ,而不是将表全部查询出来以后再进行gender过滤。 这个SELECT查询先根据id和name进行属性 投影 ,而不是将属性全部取出以后再进行过滤,将这两个查询条件 连接 起来生成最终查询结果。
Caches & Buffers: 查询缓存组件
- MySQL内部维持着一些Cache和Buffer,比如Query Cache用来缓存一条SELECT语句的执行结果,如果能够在其中找到对应的查询结果,那么就不必再进行查询解析、优化和执行的整个过程了,直接将结果反馈给客户端。
- 这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等 。
- 这个查询缓存可以在 不同客户端之间共享 。
- 从MySQL 5.7.20开始,不推荐使用查询缓存,并在 MySQL 8.0中删除,因为这个比较鸡肋
小故事:
如果我问你9+8×16-3×2×17的值是多少,你可能会用计算器去算一下,最终结果35。如果再问你一遍9+8×16-
3×2×17的值是多少,你还用再傻呵呵的再算一遍吗?我们刚刚已经算过了,直接说答案就好了。
第三层:引擎层
插件式存储引擎层( Storage Engines),真正的负责了MySQL中数据的存储和提取,对物理服务器级别维护的底层数据执行操作,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。
MySQL 8.0.25默认支持的存储引擎如下:
存储层
所有的数据,数据库、表的定义,表的每一行的内容,索引,都是存在 文件系统上,以文件的方式存在的,并完成与存储引擎的交互。当然有些存储引擎比如InnoDB,也支持不使用文件系统直接管理裸设备,但现代文件系统的实现使得这样做没有必要了。在文件系统之下,可以使用本地磁盘,可以使用DAS、NAS、SAN等各种存储系统。
总结
下面为了熟悉SQL执行流程方便,我们可以简化如下:
简化为三层结构:
- 连接层:客户端和服务器端建立连接,客户端发送 SQL 至服务器端;
- SQL 层(服务层):对 SQL 语句进行查询处理;与数据库文件的存储方式无关;
- 存储引擎层:与数据库文件打交道,负责数据的存储和读取。
边栏推荐
- Regular expressions are actually very simple
- jar运行报错no main manifest attribute
- 简单解决phpjm加密问题 免费phpjm解密工具
- C miscellaneous dynamic linked list operation
- Some thoughts on the study of 51 single chip microcomputer
- CANoe的数据回放(Replay Block),还是要结合CAPL脚本才能说的明白
- Several silly built-in functions about relative path / absolute path operation in CAPL script
- Target detection -- yolov2 paper intensive reading
- 51单片机进修的一些感悟
- Bugku web guide
猜你喜欢
四川云教和双师模式
Write your own CPU Chapter 10 - learning notes
15 medical registration system_ [appointment registration]
AI的路线和资源
The appearance is popular. Two JSON visualization tools are recommended for use with swagger. It's really fragrant
手把手教您怎么编写第一个单片机程序
Listen to my advice and learn according to this embedded curriculum content and curriculum system
CANoe的数据回放(Replay Block),还是要结合CAPL脚本才能说的明白
17 医疗挂号系统_【微信支付】
15 医疗挂号系统_【预约挂号】
随机推荐
通过bat脚本配置系统环境变量
Listen to my advice and learn according to this embedded curriculum content and curriculum system
四川云教和双师模式
Single chip microcomputer realizes modular programming: Thinking + example + system tutorial (the degree of practicality is appalling)
单片机实现模块化编程:思维+实例+系统教程(实用程度令人发指)
Control the operation of the test module through the panel in canoe (Advanced)
MySQL实战优化高手06 生产经验:互联网公司的生产环境数据库是如何进行性能测试的?
颜值爆表,推荐两款JSON可视化工具,配合Swagger使用真香
华南技术栈CNN+Bilstm+Attention
Embedded development is much more difficult than MCU? Talk about SCM and embedded development and design experience
MySQL ERROR 1040: Too many connections
MySQL实战优化高手05 生产经验:真实生产环境下的数据库机器配置如何规划?
13 医疗挂号系统_【 微信登录】
C杂讲 动态链表操作 再讲
美疾控中心:美国李斯特菌疫情暴发与冰激凌产品有关
Several errors encountered when installing opencv
14 medical registration system_ [Alibaba cloud OSS, user authentication and patient]
cmooc互联网+教育
[CV] target detection: derivation of common terms and map evaluation indicators
宝塔的安装和flask项目部署