Mysql基础框架分析
基本架构概览
mysql基本架构核心部分为连接器,查询缓存,分析器,优化器,执行器,具体如下图:
1.连接器:用于身份认证和权限相关
2.查询缓存:查询语句先通过缓存进行搜索(作用不大,后续版本已经移除)
3. 分析器:用于进行sql语法正确性检查
4. 优化器:将sql进行优化,按照Mysql认为最优的方式进行执行。
5. 执行器:执行语句,从存储引擎返回数据。
简单来说Mysql分为Server层和存储引擎层。
1.Server层:主要包括用户合法性以及权限校验(连接器)查询缓存,分析器,优化器,执行器等。所有挎存储引擎的功能都在这一层实现。例如存储过程,触发器,视图,函数等。还有一个通用的binlog日志模块。
2.存储引擎:主要负责数据的存储和读写,采用可以替换的插件式架构,支持InnoDb,MyIsam等,其中InnoDb引擎带有日志模块redolog。
执行过程分析
- 查询语句执行过程分析
例如:SELECT * FROMtest1
WHERE num1 = 10000 and num2=‘10000’;
(1). 检查该语句是否有权限,如果没有权限,直接返回错误信息,如果有权限,会先查询缓存,命中缓存直接返回,否则进行下一步
(2).通过分析器进行词法分析,提取SQL语句的关键元素,比如上述查询语句关键字select,查询表 test1,查询条件num1=10000,然后判断这个查询语句是否有语法错误,关键字是否正确,如果没有进入下一步。
(3). 根据优化器确定执行方案,上述sql语句存在两种执行顺序
1. 先查询num1=10000 在查询num2=‘10000’
2. 先查询num2=‘10000’ 在查询num1=10000;
此时,优化器会根据优化算法,确定最优的执行方案
(4). 执行器根据上述优化后的sql语句执行具体的执行过程,并从存储引擎中获取数据进行返回。
- 更新语句执行过程分析
例如:updatetest1
set num1 = 10001 where num1 = 10000 and num2=‘10000’;
更新语句执行过程与上类似,只不过在执行器执行更新操作时,存储引擎会记录相关的更新日志。Mysql自带binlog日志模块,innodb提供redolog模块。
具体记录流程如下:Innodb引擎把数据保存在内存中,同时记录redolog,此时redolog进入prepare状态,然后告诉执行器更新成功,随时可以提交,执行器收到通知以后记录binlog,然后调用引擎接口提交redolog进入commit状态。
为什么要有redolog以及redolog两阶段提交的作用
- 为什么要有redolog?
并不是只有一个日志模块不行,事实上,redolog是innodb引擎通过redolog来支持事务的。
2.为什么要有二阶段提交?
(1). 如果先写redolog直接进行提交,在记录binlog,如果在redolog记录完成后,数据库宕机,当服务恢复时,根据redolog进行数据恢复,此时binlog并没有记录相关数据,从库不会进行同步,此时主从同步也会丢失这一条数据.
(2).如果先写binlog在写redolog,此时,如果binlog写完,机器异常重启,由于没有redolog,无法恢复这一条记录,但是binlog又有这一条记录,从库从binlog中同步这一条数据,造成从库有而主库无,从而会造成数据不一致。
如果采用redolog两阶段提交,写完binlog后,在提交redolog就会防止出现上述问题,从而保证数据一致性,这主要由Mysql处理机制决定,Mysql处理过程如下:
- 如果redolog已经commit,则毫不犹豫的把事务提交。
- 如果redolog处于prepare状态,则去判断事务对应的binlog是否完整,是则提交事务,否,则回滚事务。
两阶段提交,其实是为了保证redolog和binlog的逻辑一致性,从而保证主从数据库的数据一致性。