WAL 全称为 Write-Ahead Logging,预写日志系统。其主要是指 MySQL 在执行写操作的时候并不是立刻更新到磁盘上,而是先记录在日志中,之后在合适的时间更新到磁盘中。日志主要分为 undo log、redo log、binlog。

当内存数据页跟磁盘数据页内容不一致的时候,我们成这个内存页为“脏页”。内存数据写入磁盘后,内存和磁盘上的数据页内容就一致了,称为“干净页”。

MySQL 真正使用 WAL 的原因是:磁盘的写操作是随机 IO,比较耗性能,所以如果把每一次的更新操作都先写入 log 中,那么就成了顺序写操作,实际更新操作由后台线程再根据 log 异步写入。这样对于 client 端,延迟就降低了。并且,由于顺序写入大概率是在一个磁盘块内,这样产生的 IO 次数也大大降低。所以 WAL 的核心在于将随机写转变为了顺序写,降低了客户端的延迟,提升了吞吐量。

问题1:执行一个 update 语句以后,我再去执行 hexdump 命令直接查看 ibd 文件内容,为什么没有看到数据有改变呢?

回答:这可能是因为 WAL 机制的原因。update 语句执行完成后,InnoDB 只保证写完了 redo log、内存,可能还没来得及将数据写到磁盘。