在了解了MySQL的各个模块之后(点击查看MySQL各个逻辑模块),我们再看看MySQL各个模块间是如何相互协同工作的。接下来,我们通过启动MySQL,客户端连接,请求query,得到返回结果,到最后退出,这样一个过程下来进行分析。

1、  当我们执行启动MySQL命令之后,MySQL的初始化模块就从系统配置文件中读取系统参数和命令行参数,并按照参数来初始化整个系统,如申请并分配buffer,初始化全局变量,以及各种结构等。同时各个存储引擎也被启动,并进行各自的初始化工作。当整个系统初始化结束后,由连接管理模块接手。连接管理模块会启动处理客户端连接请求的监听程序,包括tcp/ip的网络监听,还有unix的socket。这时候,MySQL Server就基本启动完成,准备好接收客户端请求了。

2、  当连接管理模块监听到客户端的连接请求(借助网络交互模块的相关功能),双方通过Client & Server交互协议模块所定义的协议“寒暄”几句之后,连接管理模块就会将连接请求转发给线程管理模块,去请求一个连接线程。

3、  线程管理模块马上又会将控制交给连接线程模块,告诉连接线程模块:现在我这边有连接请求过来了,需要建立连接,你赶快处理一下。连接线程模块在接收连接请求后,首选会检查当前连接线程池中是否有被cache的空闲连接线程,如果有,则取出一个和客户端请求连接上,如果没有空闲的连接线程,则建立一个新的连接线程与客户端请求连接。当然,连接线程模块并不是在收到连接请求后马上就会取出一个连接线程和客户端连接,而是首先通过调用用户模块进行授权检查,只有客户端请求通过了授权检查后,他才会将客户端请求和负责请求的连接线程连上。

4、  在MySQL中,在客户端请求分为了两种类型:一种是query,需要调用Parser也就是Query解析和转发模块的解析才能够执行的请求;一种是command,不需要调用Parser就可以直接执行的请求。如果我们的初始化配置中打开了Full Query Logging的功能,那么Query解析与转发模块会调用日志记录模块将请求计入日志,不管是一个Query类型的请求还是一个command类型的请求,都会被记录进入日志,所以出于性能考虑,一般很少打开Full Query Logging的功能。

5、  当客户端请求和连接线程“互换暗号(互通协议)”接上头之后,连接线程就开始处理客户端请求发送过来的各种命令(或者query),接受相关请求。它将收到的query语句转给Query解析和转发模块,Query解析器先对Query个基本的语义和语法解析,然后根据命令类型的不同,有些会直接处理,有些会分发给其他模块来处理。

6、  如果是一个Query类型的请求,会将控制权交给Query解析器。Query解析器首先分析看是不是一个select类型的query,如果是,则调用查询缓存模块,让它检查该query在query cache中是否已经存在。如果有,则直接将cache中的数据返回给连接线程模块,然后通过客户端的连接的线程将数据传输给客户端。如果不是一个可以被cache的query类型,或者cache中没有该query的数据,那么query将被继续传回query解析器,让query解析器进行相应处理,再通过query分发器分发给相关处理模块。

7、  如果解析器解析结果是一条违背cache的select语句,则将控制权交给Optimizer,也就是Query优化器模块,如果是DML或者是DDL语句,则会交给表变更管理模块,如果是一些更新统计信息、检测、修复和整理类的query则会交给表维护模块去处理,复制相关的query则转交给复制模块去进行相应的处理,请求状态的query则转交给了状态收集报告模块。实际上表变更管理模块根据对应的处理请求的不同,是分别由insert处理器、delete处理器、update处理器、create处理器,以及alter处理器这些小模块来负责不同的DML和DDL的。

8、  在各个模块收到Query解析与分发过来的请求后,首先会访问控制模块检查连接用户是否有访问目标表以及目标字段的权限,如果有,就会调用表管理模块请求相应的表,并获取对应锁。表管理模块首先查看该表是否已经存在于table cache中,如果已经打开则直接进行锁相关的处理,如果没有在cache中,则需要再打开表文件获取锁,然后将打开的表交给表变更管理模块。

9、  当表变更管理模块“获取”打开的表之后,就会根据该表的相关meta信息,判断表的存储引擎类型和其他相关信息。根据表的存储引擎类型,提交请求给存储引擎接口模块,调用对应的存储引擎实现模块,进行相应处理。

不过,对于表变更模块来说,可见的仅是存储引擎接口模块所提供的一系列“标准”接口,底层存储引擎实现模块的具体实现,对于表变更管理模块来说是透明的。他只需要调用对应的接口,并指明表类型,接口模块会根据表类型调用正确的存储引擎来进行相应的处理。

10、              当一条query或者一个command处理完成后(成功或者失败)之后,控制器都会交还给连接线程模块。如果处理成功,则将处理结果(可能是一个Result set,也可能是成功或者失败的标识)通过连接线程反馈给客户端。如果处理过程中发生错误,也会将乡音个错误信息发送给客户端,然后连接线程模块会进行相应的清理工作,并继续等待后面的请求,重复上面提到的过程,或者完成客户端断开连接的请求。

如果在上面的过程中,相应模块使数据库中的数据发生了变化,而且MySQL打开了bin-log功能,则对应的处理模块还会调用日志处理模块将相应的变更语句以更新事件的形式记录到相关参数指定的二进制日志文件中。

在上面各个模块的处理过程中,各自的核心运算处理功能部分都会高度依赖整个MySQL的核心API模块,比如内存管理,文件I/O,数字和字符串处理等等。

下面用图来表示各个模块处理流程。

                   

              

本文参考资料:《MySQL性能调优与架构设计》

MySQL各逻辑模块工作配合的更多相关文章

  1. MySQL各模块工作配合

    MySQL各模块工作配合 在了解了 MySQL 的各个模块之后,我们再看看 MySQL 各个模块间是如何相互协同工作的 .接下来,我们通过启动 MySQL,客户端连接,请求 query,得到返回结果, ...

  2. MySQL与逻辑模块

    启动MySQL 1.初始化模块运行&&存储引擎初始化运行 2.1中运行完毕后 ---->连接管理模块接手 3.连接管理模块启动处理client连接请求的监听程序(tcp/ip 网 ...

  3. PCIe例程理解(一)用户逻辑模块(接收)仿真分析

    前言 本文从例子程序细节上(语法层面)去理解PCIe对于事物层数据的接收及解析. 参考数据手册:PG054: 例子程序有Vivado生成: 为什么将这个内容写出来? 通过写博客,可以检验自己理解了这个 ...

  4. {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析

    MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...

  5. python 3 mysql sql逻辑查询语句执行顺序

    python 3 mysql sql逻辑查询语句执行顺序 一 .SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_t ...

  6. mysql 的逻辑架构 与 存储引擎的介绍

    mysql 的逻辑架构分为三层: 最上层的服务大多数基于网络的客户端.服务器的工具或者服务都有类似的架构,比如连接处理,授权认证.安全等 第二层架构:mysql的核心服务功能都在这一层,包括查询解析, ...

  7. 简单描述MySQL常用引擎的特点及MySQL的逻辑架构

    目录 表的分类数据库引擎? 首先得说说mysql的逻辑架构,它整体分为3层: 常用引擎: 补充知识点: 表的分类数据库引擎? 引擎是什么? 引擎就是一个系统最核心的部分,比如汽车的发动机,人的心脏 数 ...

  8. Python中操作mysql的pymysql模块详解

    Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...

  9. mysqldump常用于MySQL数据库逻辑备份

    mysqldump常用于MySQL数据库逻辑备份. 1.各种用法说明 A. 最简单的用法: mysqldump -uroot -pPassword [database name] > [dump ...

随机推荐

  1. linux 安装 apache2.2.31

    Linux下安装和配置Apache 概要:本文介绍在CentOS5.4 Linux中安装和配置Apache2.2.14,并且实现Apache和Tomcat6的整合.文章分为三部分,分别是删除系统自带的 ...

  2. <转>浏览器内核分类

    浏览器的种类成千上百,但所基于的内核,却没有几个.目前主流的浏览器内核主要为以下四种: 一.Trident内核,代表产品Internet Explorer说起Trident,很多人都会感到陌生,但提起 ...

  3. javascript思维导图

    JavaScript 数组 JavaScript 函数基础 Javascript 运算符 JavaScript 流程控制 JavaScript 正则表达式 JavaScript 字符串函数 JavaS ...

  4. WCF初探-16:WCF数据协定之基础知识

    数据协定概念 “数据协定”是在服务与客户端之间达成的正式协议,用于以抽象方式描述要交换的数据. 也就是说,为了进行通信,客户端和服务不必共享相同的类型,而只需共享相同的数据协定. 数据协定为每一个做数 ...

  5. apache下自定义404错误页面

    404页面的目的是:告诉浏览者其所请求的页面不存在或链接错误,同时引导用户使用网站其他页面而不是关闭窗口离开. 很多开源系统包括CMS系统.Blog系统等不提供404页面或提供的404页面并未达到SE ...

  6. 1095: [ZJOI2007]Hide 捉迷藏

    题意:给定一棵树,每个节点可以变成黑白两色.一开始所有节点都是黑色,操作可将点颜色改变,询问当前情况下距离最远的两个黑点的距离. 动态树分治.一开始想的是对于每个节点维护主大和次大,后来发现这实在是太 ...

  7. 1427. SMS

    http://acm.timus.ru/problem.aspx?space=1&num=1427 没想到这道题错了N遍  细节很重要呀 代码: #include<iostream> ...

  8. Node.js 创建HTTP服务器

    Node.js 创建HTTP服务器 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个& ...

  9. vs git extensions简单使用方法

    一.准备工具 0.下载Git windows版本下载 http://git-scm.com/download 1.下载Git Extensions.地址http://sourceforge.net/p ...

  10. 网站后台调用winform MessageLoopApartment

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...