mysql中各个模块如何协同工作

mysql各个模块如何协同工作的,我们通过启动mysql、客户端连接、请求query,得到返回结果,最后退出。这个过程来看一下。

执行启动mysql命令后,mysql的初始化模块从配置文件中读取系统参数与命令行参数,并按参数来初始化整个系统。同时各个存储引擎也被启动,并进行各自的初始化工作。

当整个系统初始化结束后,连接管理模块接手,连接管理模块启动处理客户端连接请求的监听程序,包括tcp/ip网络监听,还有unix的socket。此时mysql server基本启动完成,准备好接受客户端请求。

当连接管理模块监听到客户端的连接请求,双方通过client&server交互协议模块定义的协议“寒暄”几句后,连接管理模块将连接请求转给线程管理模块,去请求一个连接线程。

线程管理模块马上将控制交给连接线程模块,告诉连接线程模块:我这有连接请求,需要建立连接。连接线程模块接到连接请求后,首先检查当前线程连接池中是否有cache有空闲连接线程,如果有,取出一个和客户端请求连接,如果没有,则建立一个连接线程与客户端连接。当然连接线程模块并不是收到连接请求后马上取出连接线程与客户端连接,而是先调用用户模块进行授权检查,只有客户端请求通过了授权检查后,它才会将客户端请求与线程连接上。

在mysql中,客户端请求分为两种:一种是query,需要调用parser和转发模块才能执行的请求,一种是command,不需要调用parser就可以直接执行的请求。(如果在配置文件中打开了full query logging功能,那么query解析与转发模块会调用日志记录模块将请求记入日志,不管是一个query类型的请求还是一个command类型的请求,都会记录进入日志)

当客户端请求与连接线程接上头后,连接线程就开始处理客户端请求发送过来的各种命令或是query。它将收到的query转给query解析和转发模块,query解析器先对query进行基本的语义和语法解析,然后根据命令类型的不同,有些是直接处理,有些是转发给其他模块处理。

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

如果解析器解析后的结果是一个未被cache的select,则将控制权交给optimizer,也就是query优化器模块。

如果是DML或是DDL,则交给表变更管理模块,

如果是一些更新统计信息、检测、修复和整理类的query则会交给表维护模块

复制相关的query则交给复制模块

请求状态的query交给状态收集报告模块

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

当表变更管理模块获取打开的表后,根据该表的相关meta信息,判断表的存储引擎类型的其他相关信息,根据表的存储引擎类型,提交给存储引擎接口模块,调用对应的存储引擎实现模块,进行相应处理。(对于表变更管理模块来说,可见是仅是存储引擎所提供的一系列API,底层存储引擎实现模块的具体实现,对于表变更管理模块来说是透明的,它只需要调用对应的接口,指明表类型,接口模块表根据表类型调用正确存储引擎进行相应处理)

当一个query或是一个command处理完成(成功是失败)后,控制权都会交给连接线程模块。如果处理成功,则将处理结果通过连接线程返回给客户端,如果处理失败,也会将相应的错误信息发送给客户端,然后连接线程模块会进行相应的清理工作,并继续等待后面的请求,重复上面提到的过程,或是完成客户端断开连接的请求。

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

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

整理自:MySQL性能调优与架构设计 第二章 mysql架构组成

时间: 2024-10-12 05:26:00

mysql中各个模块如何协同工作的相关文章

【转】Python中操作mysql的pymysql模块详解

Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持3.x版本. 本文测试python版本:2.7.11.mysql版本:5.6.24 一.安装 1 pip3 install pymysql 二.使用操作 1.执行SQL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

Python中操作mysql的pymysql模块详解

Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,pymysql支持python3.x. 一.安装 pip install pymysql 二.使用操作 1.执行SQL #!/usr/bin/env pytho # -*- coding:utf-8 -*- importpymysql # 创建连接 conn =pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd

(转)Python中操作mysql的pymysql模块详解

原文:https://www.cnblogs.com/wt11/p/6141225.html https://shockerli.net/post/python3-pymysql/----Python 3 进阶 -- 使用 PyMySQL 操作 MySQL 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持3.x版本. 本文测试python版本:2.7.11.mysql版本:5.6.24 一.安装 1

MySQL各逻辑模块工作配合

在了解了MySQL的各个模块之后(点击查看MySQL各个逻辑模块),我们再看看MySQL各个模块间是如何相互协同工作的.接下来,我们通过启动MySQL,客户端连接,请求query,得到返回结果,到最后退出,这样一个过程下来进行分析. 1.  当我们执行启动MySQL命令之后,MySQL的初始化模块就从系统配置文件中读取系统参数和命令行参数,并按照参数来初始化整个系统,如申请并分配buffer,初始化全局变量,以及各种结构等.同时各个存储引擎也被启动,并进行各自的初始化工作.当整个系统初始化结束后

Scrapy基础(十二)————异步导出Item数据到Mysql中

异步导出数据到Mysql中 上次说过从Item中同步写入数据库,因为网络的下载速度和数据库的I/O速度是不一样的所以有可能会发生下载快,但是写入数据库速度慢,造成线程的堵塞:关于堵塞和非堵塞,同步和异步的关系,因为没接触过,所以也不是很好的理解,这里查看了些资料,已做记录 链接1:https://www.zhihu.com/question/19732473;http://wiki.jikexueyuan.com/project/twisted-intro/ 实现异步写入mysql数据库的思路:

mysql中的中文乱码处理

备注:来自老男孩课程的学习总结 1.MySQL中添加中文数据乱码演示 a. 创建一个oldboy测试数据库并查看建表语句 模拟创建一个默认的字符集数据库 create database oldboy default character set latin1 collate latin1_swedish_ci; 2 创建一个表 mysql> create table student ( id int(4) not null auto_increment, name char(20) not nul

IM系统中聊天记录模块的设计与实现

看到很多开发IM系统的朋友都想实现聊天记录存储和查询这一不可或缺的功能,这里我就把自己前段时间为傲瑞通(OrayTalk)开发聊天记录模块的经验分享出来,供需要的朋友参考下. 一.总体设计 1.存储位置 从一开始我们就打算在服务端和客户端本地同时存储聊天记录,而且,在客户端查看聊天记录时,可以选择是从本地加载.还是从服务器加载.这样做的好处有两个: (1)从本地加载聊天记录速度非常快. (2)当更换了登录的机器,在任何地方任何时刻都可以从服务器加载完整的聊天记录,记录永远不会丢失. 2.存储方案

Mysql中中文乱码的解决

今天在V2EX上问了下遇到的mysql数据库中文乱码的问题,先说下,V2EX比CSDN论坛的模块好多了,一个小时的点击量就突破了500次,而且也有很多人帮助回答. 然后下面是我问的问题: --------------------------------------------------------- 项目全程都是utf8,hibernte写进数据库的数据取出来在myeclipse的consle下面显示是正常的,为何在数据库那个dos窗口下面显示的中文名就是乱码.注明:我的数据库所有配置都是ut

python中MySQLdb模块用法实例

篇文章主要介绍了python中MySQLdb模块用法,以实例形式详细讲述了MySQLdb模块针对MySQL数据库的各种常见操作方法,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了python中MySQLdb模块用法.分享给大家供大家参考.具体用法分析如下: MySQLdb其实有点像php或asp中连接数据库的一个模式了,只是MySQLdb是针对mysql连接了接口,我们可以在python中连接MySQLdb来实现数据的各种操作. python连接mysql的方案有oursql.PyMyS