MySQL进阶【十三】—— 深度探究 BufferPool 提升效率的原理

    科技2025-05-27  9

    BufferPool是什么

    mysql中的一块缓冲池,用来提升读写效率所有的增删改查不直接操作硬盘,都针对bufferpool进行,然后bufferpool再定时向磁盘中刷新数据bufferPool中的数据是按页从磁盘中加载而来,被修改的数据页称为脏页(与磁盘数据页不同步)

    BufferPool是如何工作的

    流程很复杂,一图千言,直接看图

    1、从磁盘中加载数据到bufferpool,按页加载(每页4K大小)2、将数据的旧值写入到undo_log,以便后续回滚3、数据对bufferpool进行修改,修改后的数据页称为脏页4、修改数据同时写入redo_log buffer5、准备提交事务时,将redo_log刷入磁盘,并标记为prepare状态6、写入bin_log日志7、提交事务,写入redo_log,并标记为commit状态8、bufferpool的脏页数据,通过单独的IO线程,定时刷入磁盘

    BufferPool是如何提升效率的

    bufferpool

    bufferpool是一个内存的缓冲池,直接针对内存操作,内存io相比于磁盘io,会有巨大幅度的性能提升(差不多1000倍),在很多服务组件上都使用缓冲池来提升性能bufferpool 中的数据,通过一条io线程,在mysql闲时或者bufferpool容量已满时,向磁盘中刷新数据

    同时写多份log,如何保证效率的

    redo_log、bin_log 都有对应的buffer,先写buffer后再刷磁盘,且刷磁盘是顺序io,效率上比随机io要高的多

    故障重启后如何保障数据恢复

    故障数据主要通过bin_log回滚,具体回滚过程详见https://blog.csdn.net/shehuinidaye/article/details/108959753

    Innodb的LRU算法

    innodb 的LRU算法是非常巧妙的,通过将LRU连表分为新生代和老年代,比例为63:37,解决了预读失败的问题老年代又做了优化,使用一个时间窗口,当老年代的数据,停留超过默认时间窗口(1秒)后,被放入到新生代的头部

    详细的文章链接 https://www.jianshu.com/p/f9ab1cb24230

    Processed: 0.009, SQL: 8