1 如何配置你的bufferPool大小

一般mysql默认为128mb,但是可能有点偏小,如果是16核32g的内存,可以调整为2g的内存,这个可以百度一下配置文件在哪进行修改。

2 mysql中抽象出来的数据单位

数据页,mysql实际上是对数据抽象出来的一个数据单位就是数据页,一个数据页里包含多行数据。
假设我们需要更新某一行数据,就会把这一行在的数据页放到bufferpool里,实际默认情况下,一个数据页里放了16kb的内容。
3 缓存页的描述信息
每个缓存页实际上都会有一个描述信息,这个描述信息大体上可以认为是用来描述这个缓存页的东西。
每个里面会有表空间,数据页编号,缓存页在bufferPool的地址以及别的杂七杂八的东西。
描述信息在前,缓存页在后。而且bufferPool中的描述数据大概占缓存页的5%左右,也就是每个描述数据大概是800字节,所以 如果设置的buffpool大小是128mb,实际上可能会超出,大约130多的样子。因为里面含有缓存页的描述数据。
image.png

3 数据库如何初始化bufferPool

首先数据库启动的时候,mysql会根据我们指定的内存大小再稍微大一些去申请一个空间,然后数据库会按照默认16kb的缓存页大小和描述数据800k去申请一个一个的块,然后当数据库的bufferPool划分完毕后就完成了初始化阶段,这个阶段后就会开始根据请求进行数据页的传入,缓存页和描述数据的放置,正常使用。

4 我们怎么知道数据库的那个缓存页是空闲的

为了解决这个问题,数据库引入了一个free链表,每个节点就是一个空闲的缓存页的描述数据块的地址,只要你一个缓存页是空闲的,那么描述数据块就会被放入这个free链表中。作用就是将所有的空闲的缓存页的描述数据地址连起来,后面用的时候直接从头拿一个放进去。

5 free链表空间占用

free链表本身就是由bufferPool里的描述数据块组成的,所以可以认为是每个描述数据块里有两个指针,一个是free_pre,一个是free_next,分别表示上一个节点和下一个节点。
对于free链表而言,只有一个基础节点是不输入bufferPool的,他是40byte大小的一个节点,存放的是free链表的头结点地址,尾节点地址,还有free链表里有多少个节点。

6 如何知道数据页有没有被缓存

数据库还会有一个哈希表数据结构,会用表空间号+数据页号作为一个key,缓存页的地址作为value。
如果有了,就代表被缓存了。
当发现没有被缓存时,会先去free链表里拿一个空闲的地方,然后把数据写到缓存页,描述信息写进去,然后把free链表这个空闲的地方链接断开。如果发现有缓存,那直接用。