【MySQL】buffer pool、free链表、flush链表、哈希表

buffer pool可理解为数据库的一个内存组件, 默认大小为128MB, 可通过 innodb_buffer_pool_size 参数可以调整其大小(单位是B). 

数据在磁盘中是以数据页的形式存储的, 把数据页加载到buffer pool中一般叫他缓存页, 每个数据页的默认大小为16k, 对应的缓存页的大小默认也是16K. 每个缓存页都对应一个描述信息, 在buffer pool 中描述信息在最前面, 各个缓存页在后面。 描述数据里记录的是缓存页在buffer pool 中的地址、数据页所属的表空间、数据页的标号等。

free链表

  当对数据进行操作的时候需要将数据页加载到buffer pool缓存页里,就需要知道哪些缓存页是空闲的。free链表就是存储的空闲缓存页的描述数据块的地址。它是一个双向链表,数据库刚启动的时候所有的缓存页都是空的,他们的描述数据都在free链表中。当需要将磁盘的数据页加载到缓存页时,就会在free链表中找到一个缓存页记录数据并写入描述数据,然后将其从free链表中去除。

存放已经使用的缓存页的哈希表

  执行sql的时候,先看用到的数据页有没有被缓存,如果已经被缓存就可以直接用了,那就需要知道哪些是已被缓存的。数据库里有一个哈希表数据结构,以表空间号+数据页号作为key,缓存页的地址作为value。当需要使用一个数据页的时候拿 表空间号+数据页号作为key去这个哈希表里查一下,没有的话就加载到buffer pool,有的话就是已经被缓存了。

flush链表

  加载到buffer pool的缓存页的脏数据脏页是要被刷到磁盘的,但是如果只是用于查询的数据就不是脏数据不用刷回磁盘,所以就需要一个flush链表来放被修改过的脏数据脏页,用于刷回磁盘。

posted @ 2021-11-26 17:13  99-1  阅读(222)  评论(0)    收藏  举报