缓冲池与数据页
缓冲池(buffer pool):主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作 缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),以一定频率刷新到磁盘,从而减少磁盘IO,加快处理速度
数据页(page):是lnnoDB存储引擎磁盘管理的最小单元,每个页的大小默认为16KB。页中存储的是行数据

redo log(重做日志)
重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。
该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file),前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都存到该日志文件中,用于在刷新脏页到磁盘,发生错误时,进行数据恢复使用。
- 前置概念铺垫:先引入MySQL中的“缓冲池(Buffer Pool)”与“数据页”概念,说明MySQL会先将数据加载到缓冲池中的数据页进行操作,而非直接修改磁盘数据,为redo log的作用场景做铺垫。
- 核心作用:保证事务的持久性(ACID中的D),即事务提交后,即使发生数据库崩溃,重启后也能通过redo log恢复已提交的修改。
- 记录内容:记录事务提交时数据页的物理修改(如“在某个数据页的某偏移量位置,将值从A修改为B”),不记录数据修改前的状态,只关注“要做什么修改”。
- 存储结构:由“内存中的redo log buffer(重做日志缓冲)”和“磁盘上的redo log file(重做日志文件)”两部分组成,避免频繁直接写磁盘导致性能损耗。
- 写入机制:采用“先写日志(Write-Ahead Logging,WAL)”机制——事务提交时,先将redo log写入磁盘的redo log file,再将缓冲池中的数据页异步刷到磁盘;同时采用“循环写”方式,当日志文件写满后,会覆盖旧的未被需要的日志(需配合 checkpoint 机制判断哪些日志可覆盖)。
- 性能优势:通过“先写缓冲、批量刷盘”和“循环写”,减少磁盘随机IO,大幅提升数据同步到磁盘的性能,保证数据库高并发场景下的效率。
undo log(回滚日志)
回滚日志,用于记录数据被修改前的信息,作用包含两个:提供回滚和 MVCC(多版本并发控制)。undo log和redo log记录物理日志不一样,它是逻辑日志。
- 可以认为当delete一条记录时,undolog中会记录一条对应的insert记录,反之亦然,
- 当update一条记录时,它记录一条对应相反的update记录。当执行rollback时,就可以从undolog中的逻辑记录读取到相应的内容并进行回滚。
- 核心作用:保证事务的原子性(ACID中的A) 和一致性(ACID中的C):
- 原子性:若事务执行过程中出错或用户触发回滚(ROLLBACK),可通过undo log恢复数据到事务开始前的状态,确保事务“要么全做,要么全不做”。
- 一致性:配合MVCC(多版本并发控制)机制,为读操作提供数据的历史版本,避免脏读、不可重复读等问题,保证事务执行过程中数据的一致性视图。
- 记录内容:记录数据修改前的逻辑信息(如“执行了INSERT操作,回滚时需执行DELETE;执行了UPDATE操作,回滚时需将值改回修改前的状态”),本质是“撤销操作的指令”,而非物理数据页修改。
- 使用场景:
- 事务回滚:当事务需要取消执行时,数据库根据undo log反向执行操作,恢复数据。
- MVCC快照读:查询时若数据已被其他事务修改,可通过undo log获取历史版本数据,实现“读不加锁、写不阻塞读”。
(三)undo log 与 redo log 核心区别对比
对比维度 | undo log(回滚日志) | redo log(重做日志) |
---|---|---|
核心作用 | 保证事务原子性、一致性;支持MVCC | 保证事务持久性 |
记录内容 | 数据修改前的逻辑信息(撤销指令) | 数据页的物理修改(执行的修改) |
数据恢复方向 | 反向恢复(回滚到事务开始前状态) | 正向恢复(崩溃后重现已提交的修改) |
与事务的关联 | 事务执行过程中实时生成,事务提交后可能被保留(供MVCC使用) | 事务提交时写入,后续可被循环覆盖 |
对性能的影响 | 主要影响事务回滚和读性能(支撑MVCC) | 优化写性能(减少磁盘随机IO) |