buffer pool

buffer pool 增删查改

buffer pool 存储内容:
包括数据页,索引,自适应索引,字典信息等
 

buffer pool 查找:

 
如上图,如果是读操作,要查找的数据所在的数据页在缓冲池中时,则将结果返回。
否则会把对应的数据页加载到内存中,然后再返回结果。
每一个页,都有一个描述信息。可以通过描述信息快速查找,类似于一个索引map
 

buffer pool 更新:

如上图,对于写操作,如果要修改的行所在的数据页在内存中,则修改后返回对应的结果。
如果不在的话,则会从磁盘里将该行所对应的数据页读到内存中再进行修改。
【注意:此时修改的数据还未持久化到磁盘中,此时磁盘数据与内存中的数据可能不一致】
 
但是这其中也有一个问题:
因为修改的数据都是在内存中修改,并没有持久化到磁盘中,这样容易丢失数据。
在Buffer Pool中已经修改但还没刷新到磁盘的数据,称为脏页。
MySQL必然会有后台线程会去将Buffer Pool中的这些脏页刷新到磁盘中进行持久化,不然就很容易丢失数据了。
 
buffer pool 相关链表:
Free List
空闲链表,其上的节点都是未被使用的节点,如果需要从数据库中分配新的数据页,直接从上获取即可。
InnoDB需要保证Free List有足够的节点,提供给用户线程用,否则需要从FLUSH List或者LRU List淘汰一定的节点。
InnoDB初始化后,Buffer Chunks中的所有数据页都被加入到Free List,表示所有节点都可用。
 
LRU List
最近最少使用链表(Least Recently Used),这个是InnoDB中最重要的链表。
LRU链表主要用来管理Buffer Pool中的缓存页是如何被淘汰的。
所有新读取进来的数据页都被放在上面,链表按照最近最少使用算法排序,最近最少使用的节点被放在链表末尾。
如果Free List里面没有节点了,就会从中淘汰末尾的节点。
LRU List被分为两部分,默认前5/8为热数据区域,存储经常被使用的热点数据页;后3/8为冷数据区域。
新加载到Buffer Pool中,默认被加在冷数据区域的链表头部,只有满足一定条件后,才被移到热数据区域上,主要是为了预读的数据页和全表扫描缓存池污染。
 
FLUSH List
脏页链表,链表中的所有节点都是脏页,也就是说这些数据页都被修改过,但是还没来得及被刷新到磁盘上。
在FLUSH List上的页面一定在LRU List上,但是反之则不成立。
 
 
buffer pool常见问题:
 
 
posted @ 2022-09-23 17:34  程序员博博  阅读(68)  评论(0编辑  收藏  举报