脏页的定义:

当某个内存页的数据和磁盘的数据页不一致的时候,内存的这个页就是脏页,

如果一致就是干净页

举个例子理解一下:

顾客A去饭店吃饭,之前已经赊过账,赊账金额是10元,这次又要赊账10元,

老板有个账本,里面记录了每个顾客最终赊账金额,如果顾客A这次要赊账了,如果老板去账本

一页一页的翻,一直翻到顾客A的记录,然后更新记录,那么会很慢,费时间,所以老板有块小黑板,

这个时候就直接记录下来顾客A又赊账10元,比如说格式是:顾客A+10,类似这样的操作,这样就会很快了

这个账本就对应磁盘,小黑板就对应redolog,而内存就对应老板的最新记忆,老板的大脑最新记忆是这个人总欠账20元也就是内存,

但是这个时候磁盘对应的这条数据的记录还是10元,那么这个时候这个老板的记忆就是脏记忆,也就是脏页,

那么什么时候把最新的小黑板上的操作记录计算进账本中去呢?

一般有这么几个时机

1.饭店打烊以后,一般饭店打烊后,老板会把当天的操作记录,也就是小黑板上的记录,计算到账本上,对应到mysql里面就是关闭数据库的时候会应用redolog里面的记录到磁盘上。

2.营业期间饭店有空闲的时候,一般在一天当中,饭店肯定有空闲的时候,那么在这些空闲的时候,老板会把小黑板上的记录操作到账本里,对应到mysql里面就是,Mysql有个线程在后台,如果他认为数据库很闲,那么就会刷盘

3.小黑板写满了,如果小黑板写满了,那么新来的人如果要赊账就要等待了,有把这个小黑板上的操作计算到账本里面,擦掉小黑板上的内容,才可以进行赊账操作,对应到mysql里面,就是redolog写满了,因为redolog不是追加写的,那么写满了就必须要擦除,那么擦除之前必须要把redolog上的记录应用到磁盘里面,比如说把某个数据的+1,-1应用到磁盘里面,在这期间数据库无法进行操作会被阻塞,所以在这里面redolog的大小不可以设置的太小,否则redolog很容易就会被写满,也就是说刷盘的频率很高

4.这个不好举例子,mysql有个bufferpool用来管理内存,这块内存也是有大小的,那么既然有大小的就会有淘汰问题,在这个内存中的内存页,有脏页和干净页,那么淘汰就有可能会淘汰的是个脏页,如果淘汰的是个脏页,那么就