mysql各个模块如何协同工作的,我们通过启动mysql、客户端连接、请求query,得到返回结果,最后退出。这个过程来看一下。
执行启动mysql命令后,mysql的初始化模块从配置文件中读取系统参数与命令行参数,并按参数来初始化整个系统。同时各个存储引擎也被启动,并进行各自的初始化工作。
当整个系统初始化结束后,连接管理模块接手,连接管理模块启动处理客户端连接请求的监听程序,包括tcp/ip网络监听,还有unix的socket。此时mysql server基本启动完成,准备好接受客户端请求。
当连接管理模块监听到客户端的连接请求,双方通过client&server交互协议模块定义的协议“寒暄”几句后,连接管理模块将连接请求转给线程管理模块,去请求一个连接线程。
线程管理模块马上将控制交给连接线程模块,告诉连接线程模块:我这有连接请求,需要建立连接。连接线程模块接到连接请求后,首先检查当前线程连接池中是否有cache有空闲连接线程,如果有,取出一个和客户端请求连接,如果没有,则建立一个连接线程与客户端连接。当然连接线程模块并不是收到连接请求后马上取出连接线程与客户端连接,而是先调用用户模块进行授权检查,只有客户端请求通过了授权检查后,它才会将客户端请求与线程连接上。
在mysql中,客户端请求分为两种:一种是query,需要调用parser和转发模块才能执行的请求,一种是command,不需要调用parser就可以直接执行的请求。(如果在配置文件中打开了full query logging功能,那么query解析与转发模块会调用日志记录模块将请求记入日志,不管