MysqL 物理组成-一条更新语句是如何执行的
上一小节,我们介绍了MysqL的日志文件和数据文件,相信大家对MysqL的物理组成已经有了一个初步认识。本小节,我们继续深入,来看看一条更新语句在MysqL内部是如何执行的?以及 binlog(归档日志)和redo log(重做日志)在其中所起的重要作用。
1.一条更新语句是如何执行的
相比查询语句的执行流程,更新语句的执行流程多了两个重要的日志模块: binlog(归档日志)和redo log(重做日志) 。上一小节,我们介绍了这两个日志的基本概念,大家可能会有疑问,这两份日志,到底有啥区别?为什么会有两份日志呢?
1.1 binlog和redo log的区别
- binlog是逻辑日志,记录某个语句的基本逻辑,即sql语句;redo log是物理日志,记录在某个数据页所做的修改;
- binlog是在MysqL的Server层实现,所有的存储引擎都可以使用binlog这个日志模块;redo log是InnoDB存储引擎特有的日志模块;
- binlog是追加写,在写满或重启之后,会生成新的binlog文件,之前的日志不会进行覆盖;redo log是循环写,空间大小是固定的;
- binlog 是在事务最终提交前写入的;redo log是在事务执行过程不断的写入;
- binlog可以应用于数据归档、主从搭建等场景;redo log作为异常宕机或者介质故障后的数据恢复使用;
1.2 为什么会有两份日志
刚开始MysqL自带的引擎是MyISAM,然而MyISAM并没有crash-safe的能力,而binlog只能用于数据归档。InnoDB引擎是另外一家公司开发的MysqL插件,同时开发了redo log来实现crash-safe能力。从5.5.5版本开始,InnoDB成为MysqL的默认存储引擎,也是当前最常用的存储引擎。
1.3 一条更新语句的执行流程
update语句将id等于1这一行的value值加1
update set value=value+ where id=;
CREATE TABLE `` (
`id` int() DEFAULT NULL,
`value` int() DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
我们来看看这条update语句在MysqL内部是如何执行的?