mysql各模块之间的协作

      当我们执行启动MySQL 命令之后,MySQL 的初始化模块就从系统配置文件中读取系统参

数和命令行参数,并按照参数来初始化整个系统,如申请并分配buffer,初始化全局变量,
以及各种结构等。同时各个存储引擎也被启动,并进行各自的初始化工作。当整个系统初始
化结束后,由连接管理模块接手。连接管理模块会启动处理客户端连接请求的监听程序,包
括tcp/ip 的网络监听,还有unix 的socket。这时候,MySQL Server 就基本启动完成,准
备好接受客户端请求了。
       当连接管理模块监听到客户端的连接请求(借助网络交互模块的相关功能),双方通过
Client & Server 交互协议模块所定义的协议“寒暄”几句之后,连接管理模块就会将连接
请求转发给线程管理模块,去请求一个连接线程。
      线程管理模块马上又会将控制交给连接线程模块,告诉连接线程模块:现在我这边有连
接请求过来了,需要建立连接,你赶快处理一下。连接线程模块在接到连接请求后,首先会
检查当前连接线程池中是否有被cache 的空闲连接线程,如果有,就取出一个和客户端请求
连接上,如果没有空闲的连接线程,则建立一个新的连接线程与客户端请求连接。当然,连
接线程模块并不是在收到连接请求后马上就会取出一个连接线程连和客户端连接,而是首先
通过调用用户模块进行授权检查,只有客户端请求通过了授权检查后,他才会将客户端请求
和负责请求的连接线程连上,服务器给用户分配一个thread_stack存储用户和SQL信息。
        在MySQL 中,将客户端请求分为了两种类型:一种是query,需要调用Parser 也就是
Query 解析和转发模块的解析才能够执行的请求;一种是command,不需要调用Parser 就可
以直接执行的请求。如果我们的初始化配置中打开了Full Query Logging 的功能,那么
Query 解析与转发模块会调用日志记录模块将请求计入日志,不管是一个Query 类型的请求
还是一个command 类型的请求,都会被记录进入日志,所以出于性能考虑,一般很少打开Full
Query Logging 的功能。
        当客户端请求和连接线程“互换暗号(互通协议)”接上头之后,连接线程就开始处理
客户端请求发送过来的各种命令(或者query),接受相关请求。它将收到的query 语句转
给Query 解析和转发模块,Query 解析器先对Query 进行基本的语义和语法解析,然后根据
命令类型的不同,有些会直接处理,有些会分发给其他模块来处理。
       如果是一个Query 类型的请求,会将控制权交给Query 解析器。Query 解析器首先分析
看是不是一个select 类型的query,如果是,则调用查询缓存模块,将该SQL转化为对应的HASH值,
查找是否有相同的HASH值。如果有,则不进行后续操作,直接根据【是否有对应权限】HASH值对应
的地址,则直接将cache 中的数据返回给连接线程模块,然后通过与客户端的连接的线程将数据传
输给客户端。如果不是一个可以被cache 的query类型,或者cache 中没有该query 的数据,那么
query 将被继续传回query 解析器,让query解析器进行相应处理,再通过query 分发器分发给相关处理模块。
         如果解析器解析结果是一条未被cache 的select 语句,则将控制权交给Optimizer,
也就是Query 优化器模块,先对其进行初步处理(sql是否有明显的语法错误、表名、列名等是否存在),
做完这些处理后,然后根据sql使用的索引、join、sort情况制定出服务器认为最优的执行计划。
可以通过使用SQL HIT,使服务器安装用户意愿优化,如果是DML 或者是DDL 语句,则会交给表变更管理模块,
如果是一些更新统计信息、检测、修复和整理类的query 则会交给表维护模块去处理,复制相关的
query 则转交给复制模块去进行相应的处理,请求状态的query 则转交给了状态收集报告模
块。实际上表变更管理模块根据所对应的处理请求的不同,是分别由insert 处理器、delete
处理器、update 处理器、create 处理器,以及alter 处理器这些小模块来负责不同的DML
和DDL 的。
        在各个模块收到Query 解析与分发模块分发过来的请求后,首先会通过访问控制模块检
查连接用户是否有访问目标表以及目标字段的权限,如果有,就会调用表管理模块请求相应
的表,并获取对应的锁。表管理模块首先会查看该表是否已经存在于table cache 中,如果
已经打开则直接进行锁相关的处理,如果没有在cache 中,则需要再打开表文件获取锁,然
后将打开的表交给表变更管理模块。
        当表变更管理模块“获取”打开的表之后,就会根据该表的相关meta 信息,判断表的
存储引擎类型和其他相关信息。根据表的存储引擎类型,提交请求给存储引擎接口模块,调
用对应的存储引擎实现模块,进行相应处理。
       不过,对于表变更管理模块来说,可见的仅是存储引擎接口模块所提供的一系列“标准”
接口,底层存储引擎实现模块的具体实现,对于表变更管理模块来说是透明的。他只需要调
用对应的接口,并指明表类型,接口模块会根据表类型调用正确的存储引擎来进行相应的处
理。
       当一条query 或者一个command 处理完成(成功或者失败)之后,控制权都会交还给连
接线程模块。如果处理成功,则将处理结果(可能是一个Result set,也可能是成功或者
失败的标识)通过连接线程反馈给客户端。如果处理过程中发生错误,也会将相应的错误信
息发送给客户端,然后连接线程模块会进行相应的清理工作,并继续等待后面的请求,重复
上面提到的过程,或者完成客户端断开连接的请求。
       如果在上面的过程中,相关模块使数据库中的数据发生了变化,而且MySQL 打开了binlog
功能,则对应的处理模块还会调用日志处理模块将相应的变更语句以更新事件的形式记
录到相关参数指定的二进制日志文件中。
        在上面各个模块的处理过程中,各自的核心运算处理功能部分都会高度依赖整个MySQL
的核心API 模块,比如内存管理,文件I/O,数字和字符串处理等等。
了解到整个处理过程之后,我们可以将以上各个模块画成如图2-2 的关系图:  


                               



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值