索引
buffer pool 是MySQL的内存区域,相当于一个数组
内存结构主要包含存储数据的数据页和描述数据的数据块(控制块),并且数据块是结合链表这种数据结构进行工作的;
数据页:默认情况下,每个数据页的大小是16KB,里边存放的是存储在数据库中的数据
数据块:默认情况下,数据块的大小是数据页的5%,里边包含数据页所属的表空间,数据页编号,以及数据页在buffer pool中的地址,大概819个字节。因此实际上buffer pool的实际空间要稍大于128MB
MySQL 启动时,是如何初始化 Buffer Pool 的呢?
1、MySQL 启动时,会根据参数 innodb_buffer_pool_size 的值来为 Buffer Pool 分配内存区域。
2、然后会按照缓存页的默认大小 16k 以及对应的描述数据块的 800个字节 左右大小,在 Buffer Pool 中划分中一个个的缓存页和一个个的描述数据库块。
注意,此时的缓存页和描述数据块都是空的,毕竟才刚启动 MySQL 。
free 链表 :存储空闲页地址,每当一个页为空闲状态,free链表就增加一个节点来记录此空闲页地址
flush链表:存储脏页的地址,每当页中的数据出现变动时,在flush链表中添加一个新节点记录次空闲页地址
lru链表:与buffer pool中的空闲页个数一一对应,每当访问一次某个空闲页的数据,就将次空闲页对应的控制快移动到链表头,此链表的作用是解决当buffer pool内存区域不足以存下新来的数据页时,去淘汰长时间没有访问过的空闲页