MySql Buffer Pool
2021-06-07 16:01:20 0 举报
图解MySql Buffer Pool底层原理机制
作者其他创作
大纲/内容
元数据16kb*0.05
4.被移除出free链表
空闲元数据地址(最少使用)
最大记录最小记录
SHOW ENGINE INNODB STATUS查看mysql的运行起来的状态
空闲元数据地址最近更新
2.写入缓存数据
表空间缓存页编号缓存页在buffer中地址。。。。。。
innodb_buffer_pool_size,默认128Minnodb_buffer_pool_instances,个数,默认1
结束节点
数据更新
更新后的数据,缓存页与磁盘数据不一致,造成脏数据
更新到磁盘操作,LRU算法
Buffer Pool(128MB)
LRU链表(双向)
写入元数据
1.获取一个空闲的缓存页
800字节
多个数据行
内存地址
flush链表(双向)
空闲元数据地址
数据页默认大小16kb,innodb_page_size
一行数据
数据页
free链表(双向)
数据发生变化
基础节点40字节不属于buffer pool
客户端发起curd请求到mysql,innodb引擎开始执行工作,在bufferpool中找寻数据是否存在缓存页面(表空间号+数据页号),如果未找到,则需要先从free链表中获取一份空的缓存页。此时缓存页已经没有空闲的了,则通过lru链表,获取一个最近最少访问的缓存页,拿到内存地址后再去flush链表中找寻缓存页,然后把数据刷新到磁盘中,清空这个缓存页,同时将这个缓存页的地址加入到free链表中。此时bufferpool拿到一个空闲的缓存页,开始从磁盘中加载数据,然后写入到缓存页中,写入成功后此缓存页从free链表中清除,加入到flush链表、lru链表中,同时进行crud的操作,并返回给客户端。
更新磁盘数据,清空缓存页
客户端CRUD
对应
加载数据页到buffer pool
缓存页16kb
文件头
查找是否有缓存页
脏数据
磁盘
数据页缓存哈希表
开始节点
3.写入元数据
文件尾部
一般生产环境bufferpool的内存设置为系统总内存的50-60%即可bufferpool总大小=(chuck大小*bufferpool数量)*倍数假设系统内存32g,bufferpool总大小为20g,chuck大小为128M,倍数为8,则bufferpool的个数是20*2048/8/128=40;倍数为16,则bufferpool的个数为20
一行数据一行数据一行数据
数据页目录
网络
每次只要有数据变化的缓存页,都会更新到链表的头部;最近被访问过的缓存页一定在头部,尾部一定是最少使用的缓存页,释放缓存页空间的时候选择最后一个即可
后台线程更新磁盘数据(异步),释放缓存页
数据页头
包含很多数据页
磁盘文件
16kb
0 条评论
下一页