1、MySQL架构设计
2021-10-16 16:33:04 1 举报
MySQL是一种开源的关系型数据库管理系统,采用客户端/服务器架构。它由一个服务器端程序(mysqld)和多个客户端程序(如mysql、mysqldump等)组成。其中,服务器端负责处理数据库的各种操作请求,包括数据的存储、查询、更新等;而客户端则用于与服务器进行通信,向服务器发送各种操作请求并接收服务器返回的结果。 在MySQL的架构设计中,采用了多线程模型来提高并发性能。每个连接都有一个线程来处理其请求,并且可以通过配置来控制并发线程数的大小。此外,MySQL还支持主从复制和分区等高级功能,以满足不同的应用场景需求。
作者其他创作
大纲/内容
Server 层
6、binlog日志写入磁盘
7、写入binlog文件和位置写入commit标记
恢复、读入内存页中
5、准备提交事务redo日志刷入磁盘
执行器
Tomcat
在redo日志中写入commit标记的意义在提交事务的时候,一共有图中的5、6、7三个步骤,必须是三个步骤都执行完毕,才算是提交了事务。redo log中没有最终commit标记,此时事务提交是失败的必须是在redo log中写入最终的事务commit标记了,然后此时事务提交成功,而且redo log里有本次更新对应的日志,binlog里也有本次更新对应的日志 ,redo log和binlog完全是一致的。
查看Mysql变量参数 show global variables修改 set例如:修改任务打开状态:set global event_scheduler=on;
连接
结束
提交事务
最优查询路径
redolog (commit)
获取SQL
IO线程
将数据从磁盘加载到内存中
MySQL的架构设计中,SQL接口、SQL解析器、查询优化器都是通用的,就是一套组件而已。但是存储引擎的话,是支持各种各样的存储引擎的,比如常见的InnoDB、MyISAM、Memory等等,我们可以选择使用哪种存储引擎来负责具体的SQL语句执行的。
是
多个线程
用户
8、刷磁盘
innodb_flush_log_at_trx_commit根据该配置来决定策略,通过什么方式将redo日志从redo log buffer里刷入到磁盘文件里去
存储引擎
3、更新内存数据
回滚redolog
更新数据
引擎层
数据存放位置
SQL接口
当前阶段事务未提交,若MySQL宕机,会导致内存中Buffer Pool和Redo Log Buffer里的数据丢失未提交事务,执行失败,会收到数据库异常,但是磁盘还是原来数据,当mysql重启之后,数据并没有任何变化所以此时如果mysql宕机,不会有任何的问题
执行SQL语句
undo日志文件
binlog日志文件
redo log(重做日志)binlog(归档日志)
N
undo日志文件为了考虑到之后可能要回滚数据的需要,这里会把更新前的值写入undo日志文件比如“id = 10”和“zhangsan”这些信息写入undo日志文件中
更新buffer pool中的缓存数据
完整
查询优化器(Optimizer)针对编写的复杂SQL语句生成查询路径树,然后从中选择一条最优的查询路径出来
更新数据是否在内存中
刷到磁盘中
否
调用接口完成SQL语句
缓冲池Buffer Pool
网络连接必须让线程来处理由一个线程来监听请求以及读取请求数据
仅prepare
解析SQL
当前阶段数据为脏数据因为内存数据已更新,但是磁盘数据未更新
提交事务将redo日志写入磁盘中
SQL接口(SQL Interface)专门用于执行发送给MySQL的增删改查的SQL语句
查询解析器
查找关联binlog
redo日志文件
Redo Log Buffer内存修改数据之后,Redo Log Buffer记录对数据做了什么修改
验证binlog是否完整并提交
1、加载缓存数据
执行器根据优化器生成的一套执行计划,然后不停的调用存储引擎的各种接口去完成SQL语句的执行计划非常核心的一个组件,负责跟存储引擎配合完成一个SQL语句在磁盘与内存层面的全部数据更新操作
一个后台的IO线程,会在之后某个时间里,随机的把内存buffer pool中的修改后的脏数据给刷回到磁盘上的数据文件中IO线程把脏数据刷回磁盘之前,哪怕mysql宕机崩溃也没关系,因为重启之后,会根据redo日志恢复之前提交事务做过的修改到内存里去
内存
把binlog写入磁盘文件之后,接着就会完成最终的事务提交,此时会把本次更新对应的binlog文件名称和这次更新的binlog日志在文件里的位置,都写入到redo log日志文件里去,同时在redo log日志文件里写入一个commit标记
Redo LogBuffer
Y
MySQL数据库服务器
查询解析器SQL解析,就是按照既定的SQL语法,对按照SQL语法规则编写的SQL语句进行解析,然后理解这个SQL语句要干什么事情
脏数据
工作线程
验证commit
发送请求
定位到需要更新的行数据
数据库连接池
记录undo log
磁盘
写入Redo Log Buffer
查询优化器
4、写redo日志
读取redolog
InnoDB 存储引擎
崩溃恢复
执行计划
更新数据(图解)
磁盘文件
访问数据
缓冲池会缓存很多的数据,以便于以后在查询的时候,要是内存缓冲池里有数据,就可以不用查磁盘比如:对“id = 10”这行数据的“name由zhangsan更新为lisi”执行更新操作,先会查看是否在缓冲池中,若不在,则会直接从磁盘里加载到缓冲池中,并且还会对这行记录加独占锁
工作线程从网络连接中读取SQL语句
binlog(持久化)
更新数据和崩溃恢复(流程图)
存储引擎负责执行SQL语句,会按照一定的步骤去查询内存缓存数据,更新磁盘数据,查询磁盘数据,等等,执行诸如此类的一系列的操作
2、写入数据的旧值便于回滚
0 条评论
回复 删除
下一页