MySQL 架构(面试用)
MySQL的基本架构
Server 层:主要包括连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图,函数等,还有一个通用的日志模块 binglog 日志模块。
存储引擎层: 主要负责数据的存储和读取,采用可以替换的插件式架构,支持 InnoDB、MyISAM、Memory 等多个存储引擎,其中 InnoDB 引擎有自有的日志模块 redolog 模块。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始就被当做默认存储引擎了。
查询语句执行过程解析
1、客户端发起一个请求时,首先会建立一个连接
2、服务端会检查缓存,如果命中则直接返回,否则继续之后后面步骤
3、服务器端根据收到的sql语句进行解析,然后对其进行词法分析,语法分析以及预处理
4、由优化器生成执行计划
5、调用存储引擎层API来执行查询
6、返回查询到的结果
更新语句执行过程解析
1、先根据更新语句的条件,查询出对应的记录,如果有缓存,也会用到缓存
2、Server端调用InnoDB引擎API接口,InnoDB引擎将这条数据写到内存,同时写入redo log,并将redo log状态设置为prepare
3、通知Server层,可以正式提交数据了
4、Server层收到通知后立刻写入bin log,然后调用InnoD对应接口发出commit请求
5、InnoDB收到commit请求后将数据设置为commit状态
bin log
MySQL整体来看,其实就有两块:一块是 Server 层,它主要做的是 MySQL功能层面的事情;还有一块是引擎层,负责存储相关的具体事宜。上面讲的redo log是InnoDB 引擎特有的日志,而Server 层也有自己的日志,称为 bin log(归档日志),也叫做二进制日志。
redo log
redo log,即重做日志,是InnoDB引擎所特有,主要用于崩溃修复(crash-safe)。
bin log 和 redo log 的区别
1、redo log 是 InnoDB 引擎特有的;bin log 是 MySQL 的Server层实现的,所有引擎都可以使用。
2、redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;bin log 是逻辑日志,记录的是这个语句的原始逻辑,比如“给id=2 这一行的c字段加 1 ”。
3、redo log 是循环写的,空间固定会用完;bin log 是可以追加写入的。“追加写”是指 bin log 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。