Mysql专栏-Buffer Pool缓存机制的一整套运行原理
Posted TGB-Earnest
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql专栏-Buffer Pool缓存机制的一整套运行原理相关的知识,希望对你有一定的参考价值。
执行数据流程
1.从磁盘加载数据到buffer pool,会先去判断要更新的数据所在数据页是否已经被加载到了,如果已经被加载到了buffer pool中的数据页就直接使用。
2.写入数据的旧值到undo log日志中,用于事务回滚。
3.更新buffer pool数据页中内存数据。
4.写入内存中的redo log,这个时候还没写入磁盘中,记录对那个表那条记录做了什么操作。
5.提交事务,将内存的redo log写入磁盘中的redo log日志,用于崩溃恢复。
6.提交事务之前,还要在内存中写binlog日志,提交事务时写入磁盘文件。
7.将commit标记写入redo log,数据最后通过线程写入磁盘整个流程完成。
注意:最后一步是为了让redo log与binlog保持一致。5、6、7三步都执行完成才算提交事务完毕。
几个链表的使用
接着我们来讲讲,你的Buffer Pool在运行中被使用的时候,实际上会频繁的从磁盘上加载数据页到他的缓存页里去,
然后free链表、flush链表、lru链表都会在使用的时候同时被使用
比如数据加载到一个缓存页,free链表里会移除这个缓存页,然后lru链表的冷数据区域的头部会放入这个缓存页。
然后如果你要是修改了一个缓存页,那么flush链表中会记录这个脏页,lru链表中还可能会把你从冷数据区域移动到热
数据区域的头部去。
如果你是查询了一个缓存页,那么此时就会把这个缓存页在lru链表中移动到热数据区域去,或者在热数据区域中也有
可能会移动到头部去。
总之,mysql在执行CRUD的时候,首先就是大量的操作缓存页以及对应的几个链表。然后在缓存页都满的时候,必
然要想办法把一些缓存页给刷入磁盘,然后清空这几个缓存页,接着把需要的数据页加载到缓存页里去!
以上是关于Mysql专栏-Buffer Pool缓存机制的一整套运行原理的主要内容,如果未能解决你的问题,请参考以下文章
Mysql专栏-Buffer Pool缓存机制的一整套运行原理