《MySQL是怎样运行的 —— 从跟上理解MySQL》—— 第十九章
一、redo log简介
InnoDB
存储引擎是以页为单位来管理存储空间的,在真正访问页面之前,需要把在磁盘上的页缓存到内存中的Buffer Pool
之后才可以访问。对于一个已经提交的事务,在事务提交后即使系统发生了崩溃,这个事务对数据库中所做的更改也不能丢失。
这个过程就会存在一个问题,但是只在内存的Buffer Pool
中修改了页面,假设在事务提交后突然发生了某个故障,导致内存中的数据都失效了,那么这个已经提交了的事务对数据库中所做的更改也就跟着丢失了。
问题:那么如何保证这个持久性
呢?一个很简单的做法就是在事务提交完成之前把该事务所修改的所有页面都刷新到磁盘,这个方案存在些许问题:
- 刷新一个完整的数据页浪费、开销大:有时候仅仅修改了某个页面中的一个字节,但是在
InnoDB
中是以页为单位来进行磁盘IO的,也就是说在该事务提交时不得不将一个完整的页面从内存中刷新到磁盘,一个页面默认是16KB大小,只修改一个字节就要刷新16KB的数据到磁盘上显然是太浪费了。 - 随机IO性能低下:一个事务可能包含很多语句,即使是一条语句也可能修改许多页面,可能的是该事务修改的这些页面可能并不相邻,这就意味着在将某个事务修改的
Buffer Pool
中的页面刷新到磁盘时,需要进行很多的随机IO,随机IO比顺序IO要慢,尤其对于传统的机械硬盘来说。