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

相关推荐
小白男神5 天前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
这个DBA有点耶5 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
kybs19916 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
程序猿_极客6 天前
【免费】分享一套优质的基于SSM的校园失物招领系统的设计与实现,源码+文档+视频详解(讲解)
java·mysql·ssm·课程设计·失物招领系统
于平安6 天前
MySQL-触发器
数据库·mysql
大猫和小黄6 天前
MySQL锁与MVCC深度解析
mysql·mvcc·锁
数据库小学妹6 天前
MySQL库存扣减实战:原子UPDATE、分桶方案与锁范围分析
数据库·后端·mysql
Linux-lucky6 天前
39-41-Linux学习之旅之redis缓存基础与NFS基础
linux·运维·mysql·ubuntu
于平安6 天前
MySQL-变量,流程控制与游标
数据库·mysql