Mysql BufferPool 和redo log 笔记

186 阅读2分钟

image.png

free链表管理空白页: 基节点-》控制块-》控制块(存放的是空白页指针)

flush链表管理脏页: 基节点-》控制块-》控制块(存放的是脏页指针)

LRU链表管理全部:分为冷区热区, 基节点-》控制块(热区)-》控制块(热区)-》控制块(热区) -》控制块(冷区)-》控制块(冷区)

作用:当bufferpool里面的页需要淘汰,先淘汰冷区的最后一个,把新的页,加到冷区的头部 select * from t1 全表扫描 若扫描的页很多,会把bufferpoll里的热点数据所在的页都覆盖

解决:mysql认为 若你在访问冷区的页里面的数据时间间隔 >1秒的话,这是正常的,就会把那一页加到热区 但若<1秒(每一页有很多条记录,全表扫描需要访问每一条记录),这样的话就会认为你在全表扫描,不会把这页放到热区。从而解决覆盖热点数据

关于redolog

image.png

1.修改buffer pool 里面的数据页 -》脏页

2.update语句 -》 生成一个redo log(理解为一个redo log对象吧) 存的是哪一页哪个地方被修改了

3.redo log 持久化(存进内存中) 写日志到磁盘中是比较快的,因为他是一个顺序IO,不用随机IO那样去寻找。

mysql在启动的时候就生成了两个文件 logfile0,logfile1来保存这个redo log,就是说直接写进去行了,不像下面那种方式要在磁盘中这找那找

检查点的概念:首先这个redo log在内存生成保存在log buffer中,持久化(理解为将redolog写入logfile0,logfile1文件),当这两个文件写满redolog,那么还有redolog要写进来,触发 Check_point检查点,就会看看已存在logfile1中的redolog日志中对应在内存中的脏页,把那个脏页先持久化一次到这个磁盘,此时mysql处于效率比较低的状态,那个脏页都持久化到磁盘了,那对应的redolog没用了,新的redolog覆盖它。

这个redo log什么时候持久化可以设置的

image.png

猜想哪种效率高? 上面的效率高 为什么?? -》

1.修改buffer pool里的数据页-》脏页

2.修改磁盘中的数据

3.修改成功

这种效率很低,为什么? 因为假如若修改了一条记录就要把这一页都存回去磁盘,要知道这个页里面的记录在磁盘中不是连续的,只是逻辑上我们说他是连续的,这是一个随机IO的概念。 而写redo log是顺序写