刷新⼀个完整的数据⻚太浪费了
有时候我们仅仅修改了某个⻚⾯中的⼀个字节,但是我们知道
在InnoDB中是以⻚为单位来进⾏磁盘IO的,也就是说我们在
该事务提交时不得不将⼀个完整的⻚⾯从内存中刷新到磁盘,
我们⼜知道⼀个⻚⾯默认是16KB⼤⼩,只修改⼀个字节就要刷
新16KB的数据到磁盘上显然是太浪费了。
随机IO刷起来⽐较慢
⼀个事务可能包含很多语句,即使是⼀条语句也可能修改许多
⻚⾯,倒霉催的是该事务修改的这些⻚⾯可能并不相邻,这就
意味着在将某个事务修改的Buffer Pool中的⻚⾯刷新到磁
盘时,需要进⾏很多的随机IO,随机IO⽐顺序IO要慢,尤其对
于传统的机械硬盘来说。
咋办呢?再次回到我们的初⼼:我们只是想让已经提交了的事务对数
据库中数据所做的修改永久⽣效,即使后来系统崩溃,在重启后也能
把这种修改恢复出来。所以我们其实没有必要在每次事务提交时就把
该事务在内存中修改过的全部⻚⾯刷新到磁盘,只需要把修改了哪些
东⻄记录⼀下就好,⽐⽅说某个事务将系统表空间中的第100号⻚⾯
中偏移量为1000处的那个字节的值1改成2我们只需要记录⼀下:
将第0号表空间的100号⻚⾯的偏移量为1000处的值更
新为2。
这样我们在事务提交时,把上述内容刷新到磁盘中,即使之后系统崩
溃了,重启之后只要按照上述内容所记录的步骤重新更新⼀下数据
⻚,那么该事务对数据库中所做的修改⼜可以被恢复出来,也就意味
着满⾜持久性的要求。因为在系统奔溃重启时需要按照上述内容所记
录的步骤重新更新数据⻚,所以上述内容也被称之为重做⽇志,英⽂
文档被以下合辑收录
评论