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就可以将获取到的数据返回给客户端。

相关推荐
我不会起名字32214 小时前
MySQL 深分页 LIMIT 1000000 卡死:3 种改写与 4 组实测对比
mysql·性能优化·索引·分页·limit
编程火箭车16 小时前
MySQL 拥抱 AI:向量、RAG、AutoML 全进了数据库
数据库·mysql·ai编程·向量数据库·rag·automl·mysql9
o_oer16 小时前
mysql type
mysql
花卷持续成长16 小时前
慢SQL的整体优化思路
后端·mysql
鱼很腾apoc17 小时前
【MySQL】第3期 索引、事务与视图系统详解
linux·mysql·事务·索引·dml·视图·macc
misty youth18 小时前
Navicat与PHPstudy小皮
mysql·adb·php·navicat
毕业设计70319 小时前
(免费领源码)SSM董家湾线上点餐系统04682- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
java·redis·mysql·tomcat·maven·mybatis·ssm
leaf9z19 小时前
阿里云rds查看所有库大小
mysql·阿里云
Yyyyyy~19 小时前
【Mysql】表的操作
数据库·mysql
Q264336502319 小时前
【有源码】基于SpringBoot+Vue的居民健康体检与慢病干预管理系统-面向智慧医疗的体检预约与健康知识服务平台
java·vue.js·spring boot·mysql·毕业设计·javaweb·课程设计