WAL
- 在 MySQL 中,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程IO成本、查找成本都很高。
- 为了解决这个问题,MySQL 引入 WAL (Write-Ahead Logging)技术。它的关键点在于 先写日志,再写磁盘。而这就涉及到 MySQL 的两大日志模块:rede log 和 binlog
- 当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log 里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做的。
redo log
- InnoDB的 redo log 是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB,那么这块“粉板”总共就可以记录4GB的操作。从头开始写,写到末尾就又回到开头循环写,如下面这个图所示
write pos
是当前记录的位置,一边写一边后移,写到第3号文件末尾后就回到0号文件开头checkpoints
是当前已经写入数据文件的位置,当 redo log 上面的记录被写入数据文件后,checkpoints
就可以往后移write pos
和checkpoint
之间的是 redo log 上还空着的部分,可以用来记录新的操作- 如果
write pos
追上checkpoint
,表示 redo log 被写满了,这时候不能再执行新的更新,得停下来先将一些记录写入数据文件,把checkpoint
推进一下。 - 有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 cras