MySQL的Buffer Pool是一个内存区域,用于缓存数据页,从而提高查询性能。读写过程涉及到数据的从磁盘到内存的读取,以及在内存中的修改和写回磁盘。
当我们在MySQL执行一个查询请求的时候,他的过程是这样的:
读的过程比较简单的,而Buffer Pool的写的过程就有点复杂了
当我们执行一次更新语句,如INSERT、UPDATE或DELETE等时,会进行以下过程
但是需要注意的是,脏页写回磁盘是由一个后台线程进行的,在MySQL服务器空闲或负载较低时,InnoDB会进行脏页刷盘,以减少对用户线程的影响,降低对性能的影响。(https://dev.mysql.com/doc/refman/8.0/en/innodb-buffer-pool-flushing.html )
(图源自:✅InnoDB的一次更新事务是怎么实现的?)
当脏页的百分比达到innodbmaxdirtypagespctlwm变量定义的低水位标记时,将启动缓冲池刷新。缓冲池页的默认低水位标记为10%。innodbmaxdirtypagespctlwm值设为0会禁用这种提前刷新行为。
InnoDB还使用了一种适应性刷新算法,根据redo log的生成速度和当前的刷新率动态调整刷新速度。其目的是通过确保刷新活动与当前工作负载保持同步,来平滑整体性能。
当然,我们也可以手动触发脏页的刷新到磁盘,例如通过执行SET GLOBAL innodbbufferpooldumpnow=ON 来进行一次脏页刷新。
还有一种情况,就是在MySQL服务器正常关闭或重启时,所有的脏页都会被刷新到磁盘。这样才能保证数据可以持久化下来。