一、介绍

MySQL被设计为一个可移植的关系型数据库,几乎在当前所有系统上都能运行,如Linux,Solaris、FreeBSD、Mac和Windows。尽管各平台在底层(如线程)实现方面都各有不同,但是MySQL基本上能保证在各平台上的物理体系结构的一致性。是目前应用最广泛的关系型数据之一。
MySQL之父Widenius先生离开了Sun之后,觉得依靠Sun/Oracle来发展MySQL,实在很不靠谱,于是决定另开分支,这个分支的名字叫做MariaDB。MariaDB跟MySQL在绝大多数方面是兼容的,对于开发者来说,几乎感觉不到任何不同。

二、MySQL体系架构




mysql源码编译打包_mysql 技术内幕 pdf


2.1 组成部分

MySQL由以下几部分组成:
□ 连接池组件
□ 管理服务和工具组件
□ SQL接口组件
□ 查询分析器组件
□ 优化器组件
□ 缓冲(Cache)组件
□ 插件式存储引擎
□ 物理文件

2.2 存储引擎

MySQL数据库区别于其他数据库的最重要的一个特点就是其插件式的表存储引擎。MySQL插件式的存储引擎架构提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身都必需的,如SQL分析器和优化器等,而存储引擎是底层物理结构的实现,每个存储引擎开发者可以按照自己的意愿来进行开发。
需要特别注意的是,存储引擎是基于表的,而不是数据库。
目前最常用的存储引擎当属InnoDB了,下表是各存储引擎比较:


mysql源码编译打包_mysql 技术内幕 pdf_02


2.3 连接方式

连接MySQL的三种方式:

  1. TCP/IP:套接字方式是MySQL在任何平台下都提供的连接方式,也是网络中使用得最多的一种方式。
  2. 命名管道和共享内存:在Windows平台上,如果两个需要进程通信的进程在同一台服务器上,那么可以使用命名管道,
  3. UNIX域套接字:在Linux和UNIX环境下,还可以使用UNIX域套接字。UNIX域套接字其实不是一个网络协议,所以只能在MySQL客户端和数据库实例在一台服务器上的情况下使用。

三、源码浅析

源码参考的是MariaDB,github地址:https://github.com/MariaDB/server

3.1 目录结构

常用目录及作用:

  • BUILD: 内含在各个平台、各种编译器下进行编译的脚本。
  • client: 客户端工具,如mysql, mysqldump, mysqladmin等;
  • dbug: 提供一些调试用的宏定义。
  • extra: 提供innochecksum,resolveip等额外的小工具。
  • include: 包含的头文件
  • libmysqld: 生成libmysqld.so库文件。
  • libservices: 新加的目录,实现了打印功能。
  • man: 手册页。
  • mysql-test: mysqld的测试工具一套。
  • mysys: 为跨平台计,实现了一套常用的数据结构和算法,如string, hash等。
  • mysys_ssl:封装了AES、MD5、SHA等加密算法,
  • pcre:perl库。
  • plugin: mysql以插件形式实现的部分功能。
  • scripts: 提供脚本工具,如mysql_install_db、mysqld_safe、mysqld_multi等
  • sql: mysql主要代码,将会生成mysqld文件,main入口函数在sql/http://main.cc里。
  • sql-bench: 一些评测代码。
  • sql-common: 存放部分服务器端和客户端都会用到的代码。
  • storage: 存储引擎所在目录,如myisam, innodb, spider等。
  • 包含很多字符串处理的函数,比如strmov,strappend及my_atof等函数;
  • support-files:my.cnf示例配置文件及编译所需的一些工具;
  • Tests: 测试文件所在目录。
  • unittest:单元测试文件目录;
  • vio:虚拟网络IO处理系统,是对不同平台或不同协议的网络通信API的封装;
  • win:在windows平台编译所需的文件和一些说明;
  • zlib:zlib压缩算法库;

3.2 核心数据结构

常用数据结构

  • THD:线程描述符
  • NET:网络连接描述符
  • CONNECT:网络连接
  • Protocol及其子类:协议
  • TABLE:数据库表描述符(sql/table.h)
  • FIELD:字段描述符
  • handler:存储引擎的接口(ha_partition是其子类)
  • struct handlerton:存储引擎的接口,单例模式,全局每类存储引擎一个实例。
  • st_plugin_int:插件描述符
  • LEX:语法树描述符
  • Vio:底层的网络I/O socket描述符
  • HASH:哈希
  • Events:事件

部分全局变量

  • LOGGER logger
  • MYSQL_BIN_LOG mysql_bin_log
  • struct system_variables global_system_variables
  • Query_cache query_cache:查询缓存
  • struct st_maria_plugin *mysql_mandatory_plugins[]:必须加载的插件
  • scheduler_functions *thread_scheduler:调度器,在get_options()中初始化
  • handlerton *myisam_hton; myisam插件实例
  • handlerton *partition_hton; innodb插件实例
  • THD_list server_threads;

3.2 整体流程


mysql源码编译打包_mysql源码编译打包_03


四、参考

  • 《MySQL技术内幕:InnoDB存储引擎(第2版)》
  • 源码:MariaDB 10.4.12