现在的位置: 首页 > 数据库 > 正文

MySQL学习之路(七):MySQL中子系统之间的联系

2019年06月04日 数据库 ⁄ 共 1298字 ⁄ 字号 评论关闭

      正如MySQL学习之路(六):MySQL数据库的基础架构 中写道的那样,MySQL有以下几大子系统组成:

 

1.  网络连接和网络通信协议子系统

2.  线程,进程和内存分配子系统

3.  查询解析和查询优化子系统

4.  存储引擎接口子系统

5.  各类存储引擎子系统

6.  安全管理子系统

7.  日志子系统

8.  其他系统——如复制功能,错误功能

 

 

 

这里,我们再仔细研究一下各个系统之间是如何协同工作的,依然以上图中的框架图(图一)和流程图(图二)进行分析

 

mysqlarch

                                                                      图一,mysql框架图

 

 

 

                                                        图二,mysql流程图

 

 

 

 

1. 当一个客户端通过网络连接MySQL数据库服务器时,网络连接子系统执行一系列的与网络协议有关底层任务,然后网络连接子系统将控制权交给线程子系统,然后线程系统提供一个线程来处理这个连接。这个线程称为连接线程。连接线程有可能来自线程缓存(Thread Cache),也可能是新创建的。

 

2. 连接线程得到控制权,它首先调用安全管理子系统来验证用户访问的合法性,其中包括检查用户是否有权访问数据库服务器,用户密码是否正确等

 

3. 连接线程将获得的数据传给控制系统。其中一些请求在内核代码被称作命令,这些命令中的一部分可以由这个控制系统直接完成(若本次查询和上次查询一模一样,直接从Query Cache中取值),而另外一些则不可以

 

4. 对于不可以直接从直接由分发系统完成的查询,分发系统将调用解析子系统对SQL语句进行解析。同时,如果在配置MySQL系统时,我们采用了日志功能,那么分发系统还会调用日志系统区记录此次的信息(SQL语句,执行时间,执行的用户等)

 

5. 解析子系统将解析结果传给调用优化系统以优化SQL语句。同样的,现在涉及到一个安全问题,即用户是否有权访问特定的表,因此,在这里安全认证系统将再一次被调用。

 

6. 现在可以对表进行操作了,并将一系列请求发往存储引擎接口子系统,发往存储引擎子系统的请求可以是插入或者更新一个记录,基于Where条件读取一段记录等操作

 

7. 存储引擎接口子系统将上诉调用自动转化为某个具体的存储子系统方法(Storage Engine Method)。所谓自动,其实就是面向对象编程中的多态。简单来说,调用者似乎感觉在和接口子系统交互,但实际上处理的却是摸个具体存储子系统

 

8. 如果一切进行顺利的话,相应的模块将SQL执行结果发往客户端。如果不顺利的话,客户端收到的将是报错

 

9. 最后服务器端将控制权交给连接线程。连接线程完成某些清理工作,并再次等待客户端的链接或者查询,直到客户端输入Quit命令为止,到次本次会话结束。

 

ps:MySQL日常90%的工作就是如同描述的过程在运行。但也有例外,比如如果此时服务器还扮演复制功能的主服务器角色,它的复制子系统还将不停地读取二进制日志文件,如果服务器扮演的是从服务器角色,从服务器将启动两个线程,分别是SQL线程和IO线程。它们共同接受主服务器传过来的语句并更新从服务器。

 

 

 

 

 

 

 

 

 

抱歉!评论已关闭.