什么是buffer pool

  1. buffer pool是数据库的一个内存组件,里面缓存了磁盘上的真实数据。java系统对数据库执行的增删改操作都是对这个内存数据结构中的缓存数据执行的。
  2. buffer pool默认是128mb,可通过innodb_buffer_pool_size调整
  3. buffer pool存放的数据结构根据mysql抽象出来的数据结构-数据页来的。mysql抽象出数据页的概念,磁盘中有很多数据页,每一页放了很多行数据。
  4. 更新数据,是找到这一行数据所在的数据页,加载到buffer pool中,称为缓冲页。大小和数据页默认一样,16kb。每个缓冲页会对应一个描述信息。放在buffer pool的最前面,缓冲页放在后面。描述数据大小占缓冲页5%。 如果buffer pool是128mb,实际大小会比这个多。

image.png

buffer pool是如何使用的

  1. 执行增删改查时将数据页读取到缓存页中,如何知道缓存页是否是空闲的,有一个free链表,双向链表格式,节点由描述块组成,如果在链表上代表是空闲的,使用某个节点,把数据页写入缓存页,相关描述信息写入描述块,最后把节点从链表上删除。
  2. 数据页是否已经被缓存通过维护哈希表,表空间号+数据页号作为key,缓存地址为value来判断,下次再使用这个数据页,直接读取缓存地址,可知数据已经被放入缓存页了。

image.png

buffer pool中的flush链表

  1. 数据在缓存页中被修改,与磁盘中的数据页数据不一致,被称为脏数据。缓存页中的数据需要被刷回磁盘,但是有部分数据不需要刷回。用flush链表记录需要被刷回磁盘的数据。
  2. flush链表与free链表一样,双向链表。free链表中的结点被修改使用就从free链表脱离,加入flush链表。

    buffer pool中的结构

  3. buffer pool由chunk组成的,根据参数innodb_buffer_pool_chunk_size控制,默认128MB

  4. 所有的chunk共享这些free,flush,lru链表
  5. 可以基于chunk机制,动态调整buffer pool的大小。如果由8G扩充到16G,只需要申请一系列大小为128MB的连续的内存块。然后把把数据拷贝回去。