02 | 日志系统:一条SQL更新语句是如何执行的?

一、mysql更新

我们先从一个表的更新开始说起,下面是建表的语句,这个表有一个主键ID和一个整型字段c;

create table T(ID int primary kry,c int);
insert into T(c) values(1);

如果要将ID=2这一行的值加1,SQL语句就会这么写

update T set c=2 where ID=0;

mysql语句的更新流程有两个重要的日志模块:redo log(重做日志)和binlog(归档日志)。如果接触MySQL,那么这两个词是肯定绕不过的

二、重要的日志模块

1、redo log

redo log是InnoDB内置的日志模块,他的大小是固定的,不支持持久化存储,比如配置4个一组文件,每个文件的大小是1GB,那么就可以记录4G的操作,写到末尾就又从头开始循环,如下图所展示的。

write pos是当前记录的位置,一边写一边往后移动,写到第三号文件末尾的时候就回到0号文件开头。checkpoint是当前要擦除的位置,也是往后移动并且循环,在擦除记录前要把记录更新到硬盘数据文件上。
write pos和checkpoint之间是空白部分,用来记录新的操作。如果write pos追上checkpoint,表示这4G的文件以及写满了,这时候就不能执行更新操作,需要checkpoint将数据推一下,留出来一定的空间位置。
有了redo log,InnoDB就可以保证即使数据库发送异常重启,之前提交的记录也不会丢失。

猜你喜欢

转载自www.cnblogs.com/charon2/p/11755413.html