image.png
    image.jpeg

    各模块之间是如何配合的:(为了看得清楚,把模块都用【】框了出来)

    • 【初始化模块】从系统配置文件中读取系统参数和命令行参数,并按照参数来初始化整个系统。
    • 然后【连接管理模块】开始监听客户端连接请求,包括TCP/IP以及UnixSocket监听。
    • 借助【网络交互模块】,client&server模块“寒暄几句”之后,【连接管理模块】再转发给【线程管理模块】,请求一个连接线程。
    • 【线程管理模块】马上又会交给【连接线程模块】,首先连接线程模块会调用【用户模块】进行授权检查。
    • 通过权限检查之后,【连接线程模块】会查看连接线程池中是否有被cache的空闲连接线程,如果有就取出一个来给客户端请求占用,如果没有则创建一个新的连接线程。
    • 然后是【query解析与转发模块】,对query进行语义和语法解析。
    • 如果是select,则调用【查询缓存模块】,如果没命中缓存,则交给【query优化器模块】
    • 如果是DML或DDL语句,交给【表变更管理模块】,实际上insert、delete、update、create、alter、这些都有相应的小模块专门负责。
    • 各个模块会通过【访问控制模块】检查用户是否具备访问表、字段的权限。
    • 如果有权限,【表变更管理模块】通过【表管理模块】获取该表相关的meta信息,根据表的存储引擎,调用【存储引擎接口模块】。至于存储引擎的具体实现,【表变更管理模块】是不感知的。
    • 如果是检测、修复、整理类的query,则交给【表维护模块】处理
    • 如果是与复制相关的query,则交给【复制模块】去处理
    • query执行结束后,控制权交还给连接线程模块,将处理结果通过连接线程返回给客户端。