每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程IO成本、查找成本都很高。
为解决该问题,优先写入日志,然后写入磁盘。WAL(Write-Ahead Logging)技术
1、更新语句的执行过程
1)检查更新的数据是否在BufferPool中
2)如果不在,从磁盘中加载到BufferPool
3)更新前的内容先在内存写入undolog,异步线程刷盘
4)在内存中修改行内容,设置为Dirty Page 脏页,表示该页已经被修改但尚未写入磁盘。
5)写入redolog日志,并更新状态 prepare
6)将内存中的binlog写入缓冲区,异步fsync刷盘
7)redolog 更新状态commit
2、如何达成一致性
redolog写入后,记录当前事务的全局事务ID-XID
binlog写入磁盘后,结束的位置上记录对应的XID
3、Redolog 与 binlog
1)redolog
物理日志,记录数据页的修改内容,仅 Innodb 引擎所有
用于crashsafe,宕机恢复数据
2)binlog
逻辑日志,记录sql语句,所有引擎都有
用于归档,备份恢复、主从同步
redolog 默认4个文件,每个1G大小
write pos是当前记录的位置,一边写一边后移,写到第3号文件末尾后就回到0号文件开头。checkpoint是当前要擦除的位置,往后推移并且循环的,擦除记录前要把记录更新到数据文件。
如果write pos追上checkpoint,表示记录满了,这时候不能再执行新的更新,得停下来先将一些记录写到磁盘,把checkpoint推进一下。