MySQL服务端结构

服务器处理客户端请求

客户端与服务端进行通信->都是客户端向服务端发送一段文本(sql),服务器进行处理后再向客户端发送一段文本(处理结果)。那么服务端是如何对客户端发来的信息进行处理的呢?先给出一个图了解一下。

从图中可以看出,客户端向服务端发送消息分为三个部分:连接管理、解析与优化、存储引擎

连接管理

客户端与服务端的连接有三种方式;TCP/IP、Unix域套接字、管道和内存 客户端进程连接到服务端进程时,服务器进程都会创建一个线程专门来处理与这个客户端进程的交互。当客户端断开连接时,服务端并不会将线程删除,而是缓存起来,这样的操作是避免频繁的创建进程与删除进程 。不过,线程分配过多也会严重影响系统性能,可以限制客户端连接服务端的数量,这个不在这里阐述。

当连接建立后,服务端就会一直等待客户端发来的消息,对发来的文本进行一系列的处理。

解析与优化

分为三部分:查询缓存、语法解析、查询优化

查询缓存

查询缓存可以在不同的客户端之间共享,如果客户端A刚刚查询了一个语句,而客户端B随后也查询了这个相同的语句,那么服务端就会在缓存中将数据返回给客户端B。不过,查询数据的格式如果不同,哪怕是发生了一点点的变化,都会导致缓存不会被命中。例如:用户自定义的函数,某些系统函数,如now()每次的时间都不同,当然缓存就不会被命中,查询发送了变化。还有文本sql语句不一致,如大小写不同,哪怕语句是相同的,也不会被查询到。

缓存也有失效的时候。缓存会监测每一张表。当该表的结构或数据发生变化 ,缓存都会失效。如:INSERT、 DELETE、UPDATE、TRUNCATE TABLE、DROP TABLE、ALTER TABLE、DROP DATABASE。

缓存虽然能提升系统的性能,但同时也需要对其进行维护,这些需要额外的开销。从MySQL5.7开始,不推荐使用缓存,并在MySQL8.0删除

语法解析

这一步是检测文本语法是否正确,本质上就是编译过程。

查询优化

在语法解析后,服务器就获取到了需要的信息,例如要查询的是哪张表、哪些列、搜索条件。不过,我们些的MySQL语句执行起来的效率不是很高,MySQL的优化程序 会对我们的语句进行一些优化,比如外连接转为内连接···优化的结果就是生成一个优化执行计划。这个执行计划在哪里查看呢?我们可以通过EXPLAIN语句查看某个语句的执行计划。

存储引擎

截止到查询优化步骤,其实都还没有真正接触到数据库表。MySQL服务器把数据的存储和提取都封装到了存储引擎中。 物理上如何记录,读取,写入数据都是存储引擎负责的事情。

为了方便管理,可以将连接管理,查询缓存,语法解析,查询优化这些并不真正涉及真实数据存储的功能划分为MySQL server 的功能,而将真实数据存储的功能划分为存储引擎的功能。各种不同的存储引擎都可以向上边MySQL server提供一个封装好的接口(存储引擎API)。

所以MySQL server完成了查询优化后,只需要按照优化的执行计划调用存储引擎提供的API就可以将获取到的数据返回给客户端。

相关推荐
武子康2 小时前
Java-82 深入浅出 MySQL 内部架构:服务层、存储引擎与文件系统全覆盖
java·开发语言·数据库·学习·mysql·spring·微服务
vdoi5 小时前
【Mysql】 Mysql zip解压版 Win11 安装备忘
数据库·mysql
泰勒疯狂展开5 小时前
Linux研学-MySQL安装
linux·mysql·adb
float_六七6 小时前
MySQL索引背后的B+树奥秘
数据库·b树·mysql
火凤凰--凤凰码路15 小时前
MySQL 中的“双路排序”与“单路排序”:原理、判别与实战调优
android·数据库·mysql
过客随尘15 小时前
Mysql RR事务隔离级别引发的生产Bug,你中招了吗?
后端·mysql
知其然亦知其所以然15 小时前
社招 MySQL 面试官问我:InnoDB 的 4 大特性?我靠这 4 个故事一战封神!
后端·mysql·面试
m0_5642641816 小时前
开源数据库E-R图绘制工具分享
数据库·经验分享·mysql·e-r图·开源工具
旧时光巷17 小时前
SQL基础⑭ | 变量、流程控制与游标篇
数据库·sql·学习·mysql·变量·游标·流程控制
叁沐17 小时前
MySQL 22 MySQL有哪些“饮鸩止渴”提高性能的方法?
mysql