总的来说,MySQL 可以看成是二层架构:
第一层(SQL Layer):在MySQL 数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断,sql 解析,执行计划优化,query cache 的处理等等;
第二层(Storage Engine Layer)就是存储引擎层,也就是底层数据存取操作实现部分,由多种存储引擎共同组成。
图解:
SQL Layer 中包含了多个子模块
1、初始化模块(各种 buffer,cache 结构的初始化和内存空间的申请,各种系统变量的初始化设定,各种存储引擎的初始化设置,等等) 2、核心API(提供一些需要非常高效的底层操作功能的优化实现,包括各种底层数据结构的实现,特殊算法的实现,字符串处理,数字处理等,小文件I/O,格式化输出,以及最重要的内存管理部分。) 3、网络交互模块(实现底层网络数据的接收与 发送,以方便其他各个模块调用) 4、Client & Server 交互协议模块(C/S 结构的软件系统,实现了客户端与 MySQL 交互过程中的所有协议。) 5、用户模块(包括用户的登录连接权限控制和用户的授权管理。) 6、访问控制模块(根据用户模块中各用户的授权信息,以及数据库自身特有的各种约束,来控制用户对数据的访问。) ###用户模块和访问控制模块两者结合起来,组成了 MySQL 整个数据库系统的权限安全管理的功能。 7、连接管理、连接线程和线程管理() 连接管理模块负责监听对MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。 连接线程的主要工作就是负责 MySQL Server 与客户端的通信,接受客户端的命令请求,传递Server 端的结果信息等。 线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的cache 等。 8、Query 解析和转发模块(将 query 语句进行语义和语法的分析,然后按照不同的操作类型进行分类,然后做出针对性的转发。) 将所有Client 端发送给Server 端的命令都称为query 在 MySQL Server 里面,连接线程接收到客户端的一个 Query 后,会直接将该 query 传递给专门负责将各种Query 进行分类然后转发给各个对应的处理模块,这个模块就是 query 解析和转发模块。 9、Query Cache 模块(结果集返回到内存中) Query Cache 模块在MySQL 中是一个非常重要的模块,他的主要功能是将客户端提交给MySQL 的Select 类query 请求的返回结果集cache 到内存中,与该 query 的一个hash 值做一个对应。该Query 所取数据的基表发生任何数据的变化之后,MySQL 会自动使该query 的Cache 失效。在读写比例非常高的应用系统中,Query Cache 对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。 10、Query 优化器模块(优化客户端请求的query) 根据客户端请求的query 语句,和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略, 告诉后面的程序如何取得这个query 语句的结果。 11、表变更管理模块 负责完成一些DML(数据库的增删改查基本操作) 和 DDL (定义和管理 SQL 数据库中的所有对象)的query,如:update,delte,insert,create table,alter table 等语句的处理。 12、表维护模块(表的状态检查,错误修复,以及优化和分析等工作) 13、系统状态管理模块 在客户端请求系统状态的时候,将各种状态数据返回给用户。 14、表管理器 每一个 MySQL 的表都有一个表的定义文件,也就是*.frm文件。表管理器的工作主要就是维护这些文件,以及一个cache,该cache 中的主要内容是各个表的结构信息。此外它还维护table 级别的锁管理。 15、日志记录模块 负责整个系统级别的逻辑层的日志的记录,包括error log,binarylog,slow query log 等 16、复制模块(主从复制) 复制模块又可分为 Master 模块和 Slave 模块两部分, Master 模块主要负责在Replication 环境中读取Master 端的binary 日志,以及与 Slave 端的I/O 线程交互等工作 。Slave 模块比 Master 模块所要做的事情稍多一些,在系统中主要体现在两个线程上面。一个是负责从Master 请求和接受binary 日志,并写入本地 relay log 中的I/O 线程。另外一个是负责从relay log 中读取相关日志事件,然后解析成可以在 Slave 端正确执行并得到和Master 端完全相同的结果的命令并再交给Slave 执行的SQL 线程。 17、存储引擎接口模块 存储引擎接口模块可以说是 MySQL 数据库中最有特色的一点了。目前各种数据库产品中,基本上只有 MySQL 可以实现其底层数据存储引擎的插件式管理。这个模块实际上只是一个抽象类,但正是因为它成功地将各种数据处理高度抽象化,才成就了今天 MySQL 可插拔存储引擎的特色。
DML与DDL的区别:
1.DML操作是可以手动控制事务的开启、提交和回滚的。
2.DDL操作是隐性提交的,不能rollback!
析:
1.启动MySQL :
MySQL 的初始化模块就从系统配置文件中读取系统参数和命令行参数,并按照参数来初始化整个系统,如申请并分配buffer,初始化全局变量 , 以及各种结构等。 同时各个存储引擎也被启动,并进行各自的初始化工作。当整个系统初始化结束后,由连接管理模块接手。 连接管理模块会启动处理客户端连接请求的监听程序,包括 tcp/ip的网络监听,还有unix 的socket。这时候,MySQL Server 就基本启动完成,准备好接受客户端请求了。
2.客户端请求:
当连接管理模块监听到客户端的连接请求(借助网络交互模块的相关功能),双方通过Client & Server 交互协议模块所定义的协议“寒暄”几句之后,连接管理模块就会将连接请求转发给线程管理模块,去请求一个连接线程。
连接线程模块,在客户端请求通过了授权检查后,他才会将客户端请求和负责请求的连接线程连上。
4.访问控制:在各个模块收到Query 解析与分发模块分发过来的请求后,首先会通过访问控制模块检查连接用户是否有访问目标表以及目标字段的权限,如果有,就会调用表管理模块请求相应的表,并获取对应的锁。表管理模块首先会查看该表是否已经存在于 table cache 中,如果已经打开则直接进行锁相关的处理,如果没有在 cache 中,则需要再打开表文件获取锁,然后将打开的表交给表变更管理模块。
5.当表变更管理模块“获取”打开的表之后,就会根据该表的相关meta 信息,判断表的存储引擎类型和其他相关信息。根据表的存储引擎类型,提交请求给存储引擎接口模块,调用对应的存储引擎实现模块,进行相应处理。