更新流程
假如有个表和一条更新语句
mysql> create table T(ID int primary key, c int);
mysql> update T set c=c+1 where ID=2;
更新语句会走一遍查询语句的流程,分析器会通过词法和语法解析知道这是一条更新语句,优化器决定使用ID索引,执行器负责执行,找到这一行然后更新。
日志系统
更新流程涉及两个日志模块:redolog和binlog。
redolog
WAL技术:Write-Ahead Logging,先写日志,再写磁盘。
redolog使用了WAL:当有一条记录需要更新的时候,InnoDB引擎会先把记录写到redolog,并更新内存,此时更新就算完成。InnoDB 引擎会在适当的时候(系统相对空闲、redolog写满等),将这个操作记录更新到磁盘里面。
redolog循环写的方式,write pos是当前记录的位置,一边写一边后移。checkpoint是当前要擦除的位置,也是后移循环,擦除前要把记录更新到数据文件。write pos 和 checkpoint 之间的是“粉板”上还空着的部分,可以用来记录新的操作,如果没有,会强制redolog刷盘。
InnoDB可以通过redolog保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe。