在用户执行MySQL启动命令后,MySQL的初始化模块从配置文件中读取系统参数和命令行参数,并按照这些参数初始化整个系统,同时启动并初始化各存储引擎。
在系统初始化结束后,连接管理模块启动监听程序,准备接受客户端的请求。
当一个客户端通过网络连接到MySQL服务器时,连接管理模块会监听到这个请求,通过MySQL自己定义的协议,执行相关的底层任务后,连接管理模块将请求转发给线程管理;
线程管理会提供一个连接线程来处理这个连接,如果线程缓存(Thread Cache)中有空闲的连接线程,那么就会从线程缓存中直接取一个连接线程,否则新创建一个连接线程;
此时,连接线程会调用安全管理模块,进行授权检查,验证用户访问的合法性(用户是否有权访问数据库服务器,用户密码是否正确等)
然后,连接线程开始处理客户端请求所发送过来的命令(或者Query)
对于命令,不需要调用Parse就可以直接执行
对于Query,需要进行Query解析和转发模块的解析,在Query解析器进行分析,如果是一个SELECT类型的Query,则调用查询缓存(Query Cache),检查是否存在相同的查询语句,如果存在则直接将cache中的数据返回,如果不存在或者不是SELECT类型的Query,则将此Query返回解析器。在此时的解析器中,如果是SELECT类型,则它会将控制权交给查询优化器,如果是DML或DDL语句,则会交给表变更管理模块,如果是一些更新统计信息,检测,修复和整理类的Query,则会交给表变更管理模块
这些模块在收到Query解析与分发模块分发过来的请求后,首先会通过访问控制模块检查连接用户是否有访问目标表和目标字段的权限,如果有相关权限,就会调用表管理模块请求相应的表,并获取相应的锁。
在打开表后,根据表的相关meta信息,判断表的存储引擎类型和相关信息。
根据表的存储引擎类型,提交请求给存储引擎接口,调用对应的存储引擎实现模块进行处理。
以上只是正常的流程,在此过程中还有处理失败的返回,验证失败的返回等等。如果MySQL打开了bin-log选项并且操作过程中数据发生的变化,那么相应的模块在处理的过程中会调用日志处理模块,将相应的变更语句以更新事件的形式记录到相关参数的二进制日志文件。 |
|