一条查询语句是经过连接器 分析器 优化器 执行器等功能模块,最后到达存储引擎。
image
以下所说的都基于InnoDb引擎。
当有一条记录需要更新的时候,InnoDB引擎会先把记录写到redo log里面,并更新内存,这个时候更新就算完成了。InnoDb引擎会在适当的时候把记录更新到硬盘里,往往是在系统比较空闲的时候。
如果内存满了,就只能先写到内存里面。
InnoDB的redo log是固定大小的。从头开始写,写到末位又循环回到开头写
image
write pos 是当前记录的位置,一边写一边后移,写到第 3 号文件末尾后就回到 0 号文件开头。checkpoint 是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。
write pos 和 checkpoint 之间的是“粉板”上还空着的部分,可以用来记录新的操作。如果 write pos 追上 checkpoint,表示“粉板”满了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把 checkpoint 推进一下。
有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe
binlog
MySQL主要分两层,Server层和引擎层。Server层的日志成为binlog。
binlog是逻辑日志,记录了语句的原始逻辑。
binlog是可以追加写入的,到了一定大小可以换一个文件继续写。
update语句的内部流程:
1、执行器先找引擎取ID=2的这一行。ID是主键,引擎直接用树找到这一行。
2、执行器拿到引擎给的行数据,给这个值+1,得到新的一行数据,再调存储引擎写入这行新数据。
3、引擎将新数据更新到内存,同时将这个更新记录记录到redo log。redolog处于prepare状态,告知执行器执行完成,可以提交事务
4、执行器生成操作的binlog,写入磁盘
5、执行器调用引擎的提交事务接口,引擎把redolog改成commit状态,更新完成。