【MySQL上分之路】第十二篇:MySQL一个请求的处理流程?淦

杰尼龟开干

MySQL的请求流程

疑问❓

MySQL数据库服务器在接收客户端请求后是怎么处理的呢?具体流程又是怎么样的呢?

前言

MySQL请求的具体流程走向得从MySQL的内部结构说起,MySQL的内部结构是由连接池、SQL接口、解析器、优化器、缓存、存储引擎等组成,整个结构可以分为三层,分别为MySQL Server层、存储引擎层和文件系统层,其中MySQL Server层又包括连接层和SQL层

MySQL的内部结构

Mysql基础架构图

图中Connect Pool为连接层 ,Management Services & Utillities、SQL Interface、Parser、Optimizer、Caches&Buffers为SQL层,Pluggable Storage Enigines为存储引擎层,File system和Files&Logs为文件系统层

Connectors为客户端以及不同语言与SQL的交互

连接层

应用程序主要是通过接口(ODBC、JDBC)来连接MySQL,这一层主要包括通信协议、线程处理、用户验证

Connection Pool(连接池)属于连接层。由于每次建立连接都需要消耗很多时间,连接池的作用就是将用户连接、用户名、密码、权限校验、线程处理等需要缓存的需求缓存下来,下次可以直接用已经建立好的连接,提升服务器性能

SQL层

SQL层MySQL整个服务的中心,主要是包括权限判断、查询缓存、解析器、处理器、预处理器、查询优化器、缓存和执行

存储引擎层

Pluggable Storage Enigines为存储引擎层,主要是负责对MySQL数据库中数据的存储和提取,数据的存储都是以表的形式,所以存储引擎类型也可以称为表类型

文件系统层

文件系统层主要是将数据库的数据存储在操作系统的文件系统之上,并完成与存储引擎的交互

MySQL请求的流程​走向✈️

MySQL请求过程

连接层处理流程

连接层主要流程是分为连接处理和用户授权验证

连接处理

客户端通过连接管理模块与数据库服务端请求一个连接线程来建立TCP连接,首先先判断Connection Pool(连接池)是否有空闲的连接线程,有则分配给这个TCP连接,没有则线程管理模块创建新的线程来进行连接

  • 连接管理模块是主要负责监听对MySQL Server的各种请求,接收连接请求,然后将连接请求转发到线程管理模块
  • 连接线程主要是负责MySQL Server与客户端的一个通信,接收客户端的请求信息并且返回MySQL Server的结果信息
  • 线程管理模块主要是用来管理这些连接线程,包括建立线程和关闭线程以及线程的缓存

用户授权验证

在连接线程建立之后,用户操作之前需要调用用户模块对用户进行一个授权检查验证,只有验证之后连接线程才会真正接收并处理来自客户端的请求

  • 用户模块主要是负责用户的登录、验证以及用户的权限管理

SQL层处理流程

在MySQL中,客户端的请求可以分为两种类型:Query、Command,Query需要调用查询解析器才能执行,Command不需要解析器就可以直接执行

  • 当客户端执行SQL语句请求,Parser则会对该类型的请求进行语法分析和语义分析
  • SQL语句为Query类型,则会将控制权交给Query解析器,然后判断是否为Select类型的查询,是则调用查询缓存模块,再判断该查询是否在Query Cache(查询缓存)中,在则直接返回结果,没有则将控制权转交给Optimizer(查询优化器),对查询进行优化,并且执行该SQL语句
  • 当SQL语句为其他Insert、Delete类型,则会调用其他相应的模块来进行处理

存储引擎层处理流程

存储引擎收到执行SQL语句请求后,首先会通过控制模块检查用户是否拥有访问对应目标表和目标字段的权限,若有则会调用表管理模块请求相应的表并且获取对应的锁

  • 表管理模块打开相应表之后,就会根据该表的相关信息,判断表的存储引擎类型以及其他相关信息,然后根据表的存储引擎调用不同的存储引擎接口模块,然后进行处理
  • 表变更管理模块主要是负责完成一些 DML 和 DDL 的 query,如:update,delete,insert,create table,alter table 等语句的处理
  • InnoDB存储引擎存在一个Buffer Pool(缓冲池)的内存结构,Buffer Pool是将第一次查询的结果保存在Buffer Pool中,避免过多的磁盘IO操作,之后的查询可以先从Buffer Pool中寻找,若没有再去磁盘中查找,从磁盘找到之后会将查询到的写入到Buffer Pool中,然后再将查询结果返回给客户端

当客户端请求处理完成之后,控制权会交给连接线程模块,在处理过程中发生错误则会将相应错误信息返回给客户端,若有后续请求则会重复上面的过程,若与客户端断开连接,则连接线程模块则会释放该连接线程

总结

MySQL的内部结构是由连接池、SQL接口、解析器、优化器、缓存、存储引擎等组成,整个结构可以分为三层,分别为MySQL Server层、存储引擎层和文件系统层,MySQL请求在连接层主要流程是分为连接处理和用户授权验证,在SQL主要是SQL语句权限判断、查询缓存、解析器、处理器、预处理器、查询优化器、缓存和执行,在存储引擎层是根据表类型调用不同的存储引擎接口模块

赶紧学习起来吧!我是一个正在努力找回自我的人,希望能和一起学习的人成长,有错误的地方请各位大佬帮忙指正,如果觉得有帮助就点个赞当作对我的一个小肯定❤👍,peace&love

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值