MySQL 源码解读 -- 整体架构

基本介绍 & 模块简介

Architecture

image.png

modules

模块介绍

  • BUILD: 内含在各个平台、各种编译器下进行编译的脚本。如compile-pentium-debug表示在pentium架构上进行调试编译的脚本。
  • client: 客户端工具,如mysql,mysqladmin之类。
  • cmd-line-utils: readline,libedit工具。
  • config: 给aclocal使用的配置文件。
  • dbug: 提供一些调试用的宏定义。
  • Docs: MySQL在不同平台下的参考手册
  • extra: 提供innochecksum,resolveip等额外的小工具。
    • regex: 正则表达式实现(来自多伦多大学Henry Spencer大牛的源码)。
    • zlib: zlib算法库(GNU)
    • pstack: GNU异步栈追踪工具。
    • ssl
      • netware: 在netware平台上进行编译时需要的工具和库。
  • include: 包含的头文件
  • libmysql: 库文件,生产libmysqlclient.so。
  • libmysql_r: 线程安全的库文件,生成libmysqlclient_r.so。
  • libmysqld: 嵌入式MySQL Server库.
  • libservices: 5.5.0中新加的目录,实现了打印功能。
  • man: 适合man命令查看的帮助文件。
  • mysql-test: mysqld的测试工具套件。
    • extra:
      一些基准测试代码代码,主要是Perl程序(虽然后缀是sh)。
  • mysys: 为实现跨平台,MySQL自己实现了一套常用的数据结构和算法,如string, hash等。还包含一些底层函数的跨平台封装,一般以my_开头。
  • plugin: MySQL 5.1开始支持一个插件式API接口,不需要重启mysqld即可动态载入插件,FullText就是一个例子。
  • scripts: 提供脚本工具,如mysql_install_db/mysqld_safe等。
  • sql:
    MySQL Server主要代码,将会生成mysqld文件。
  • sql-common:
    存放部分服务器端和客户端都会用到的代码,有些地方的同名文件是这里lin过去的。
  • storage: 存储引擎所在目录。
    • innobase
      • btr:

B+树的实现
- buf: 缓冲池的实现,包括LRU算法,Flush刷新算法等
- dict: InnoDB内存数据字典的实现
- dyn: InnoDB动态数组的实现
- fil: InnoDB文件数据结构以及对于文件的一些操作
- fsp: 对InnoDB物理文件的管理,如页/区/段等(即File Space)
- ha: 哈希算法的实现
- handler: 继承与MySQL的handler,实现handler API与Server交互
- ibuf: 插入缓冲(Insert Buffer)的实现
- include: InnoDB所有头文件都放在这个目录,是查找结构定义的最佳地点
- lock: InnoDB的锁实现及三种锁算法实现
- log: 日志缓冲(Log Buffer)和重做日志组(Redo Log)的实现
- mem: 辅助缓冲池(Additional Memory Pool)的实现,用来申请一些内部数据结构的内存
- mtr: 事务的底层实现(日志,缓冲)
- os: 封装一些对于操作系统的操作
- page: 页的实现,研究InnoDB文件结构,这个目录至关重要
- pars: 重载部分MySQL的SQL Parser(有待商榷)
- que: Query graph,基本上没啥用
- read: 读取游标的实现
- rem: 行管理操作(比较操作,打印等)
- row: 对于各种类型行数据操作的实现
- srv: InnoDB后台线程,启动服务,Master Thread,SQL队列等
- sync: InnoDB互斥变量(Mutex)的实现,基本同步机制
- thr: InnoDB封装的可移植线程库
- trx: 事务的实现
- usr: Session管理
- ut: 各种通用小工具

  • strings: string库,包含很多字符串处理的函数。
  • support-files: my.cnf示例配置文件及编译所需的一些工具。
  • utilities: 封装一些简单函数
  • unittest: 单元测试文件。
  • vio: 虚拟io系统,是对network io的封装,把不同的协议封装成统一的IO函数。
  • win: 在windows平台编译所需的文件和一些说明。
  1. SQL目录
  2. SQL链路: 解析;优化;执行,并行执行。
  3. SQL基础:Item; server层TABLE; Field
  4. 解析 语法、Parser
  5. 优化:optimizer
  6. 执行:executor
  7. SQL功能: outline/CCL/inventory/statement queue; spm; 7. histograms; query cache; plan cache; trigger;
  8. procedure; gis ; json;
  9. dd ;
  10. 权限验证;TDE
  11. paritiontion
  12. event scheduler/procedure
  13. Server:
  14. system/session variables(很多影响执行) ;
  15. allocator;
  16. resourcegroups ;
  17. handler
  18. 连接交互/protocol/client/maxscale
  19. 基础组件及其他功能
  20. binlog/replication/transaction-xa/MDL
  21. mysqld / sql-polar

网络

目前代码在sql/protocol.h, sql/protocol_classic.cc sql/protocol_callback.cc, sql-common/net_serv.cc, sql-common/client.cc
image.png

在最新的代码里面, 没有Protocol_binary, Protocol_local, Protocol_text  3个子类, 类型用Protocol::enum_protocol_type 来表示

核心数据结构

  • THD: 线程类
  • Item: Item类(查询条目,函数,WHERE,ORDER,GROUP,ON子句等)
  • TABLE: 表描述符
  • TABEL_LIST: JOIN操作描述符
  • Field: 列数据类型及属性定义
  • LEX: 语法树
  • Protocol: 通讯协议
  • NET: 网络描述符
  • handler: 存储引擎接口

流程

图片 1.png