前言
MYSQL的存储引擎InnoDB 是一种支持事务的存储引擎,提供了高可靠的数据持久化能力。但是,磁盘I/O是以页为单位执行的,每个页通常大小为4KB。当修改页时,由于写入中断等原因造成缺页。那么缺页的后果是什么呢?
- 数据页中一部分是新内容,另一部分是旧内容。导致页结构不一致。
- 崩溃恢复阶段即使有redo log,由于页本身已损坏,redo log的应用可能失败,无法恢复一致性。
因此,MYSQL一般采用Double Write方式解决缺页问题。
MySQL写表的核心组件
在写表流程中,以下组件发挥了核心作用:
1. InnoDB Buffer Pool
• 作用:内存中的缓冲区,用于缓存数据页,减少磁盘 I/O,提升性能。
• 特点:写操作首先更新 Buffer Pool 中的脏页,并不会立即写入磁盘。
2. Redo Log Buffer 和 Redo Log 文件
• 作用:记录事务的物理变更操作,用于崩溃恢复。
• 特点:在事务提交时将日志从内存刷新到磁盘,确保数据变更记录持久化。
3. Double Write Buffer
• 作用:解决磁盘写入中断引发的缺页(Partial Page Write)问题,提供额外的页保护机制。
• 特点:在将脏页写入表空间之前,先写入 Double Write Buffer,确保即使崩溃也能恢复数据。
写表流程
写入流程如图所示