MySQL Buffer Pool Free/Flush/LRU链表原理
2022-04-08 17:24:45 63 举报
MySQL的Buffer Pool是用于缓存数据和索引的内存区域,其内部维护了三个链表:Free链表、Flush链表和LRU链表。Free链表存储未使用的数据块,当需要读取或写入数据时,首先从该链表中获取空闲的数据块。Flush链表存储需要刷新到磁盘的数据块,当数据被修改后,会将其移动到Flush链表中,待一定时间后统一刷新到磁盘。LRU链表则用于记录最近被访问的数据块,当数据块被频繁访问时,会被移动到链表头部,而长时间未被访问的数据块则会被淘汰。通过这三个链表的组合使用,Buffer Pool能够高效地管理和缓存数据,提高数据库的性能。
作者其他创作
大纲/内容
数据页(16KB)一行数据一行数据一行数据
数据区
block_id=block02free_pre=block01free_next=null
Mysql预读机制
3.如何判断哪些缓存页是脏页
5.再将描述信息写入到描述数据中
缓存哈希表
结束节点
block_id = block01flush_pre=nullflush_next=null
先刷入磁盘再释放
开始节点
1.增加buffer pool数量和大小,提高并发处理能力
缓存池-buffer pool(128M)
(1)free,lru,flush数量
冷数据头指针移动会成为冷数据
3.获取free链表中的描述数据,以及对应空的缓存页
引发的一些问题
2.但是释放它
(2)lru冷热数据转移情况
(3)缓存读写情况
16KB*5%=800个字节
磁盘
基础节点40字节count=n
数据区组
缓存页(热数据区域)
数据页缓存哈希表表空间号 + 数据页号 = 缓存页地址表空间号 + 数据页号 = 缓存页地址表空间号 + 数据页号 = 缓存页地址
数据页
物理概念
缓存页(顺带)
但是前提得要是脏页也就是在flush链表中,否则直接释放
缓存页(16KB)一行数据一行数据一行数据...
描述数据
统计商品
表
定时冷末尾刷到磁盘
基础节点
缓存页(16KB)一行数据一行数据一行数据....
表尾数据
目标数据页相邻的页加载进来了
4.将数据页数据写入空的缓存页中
chunk
flush刷回磁盘
数据页(16KB)一行数据一行数据一行数据
每晚跑定时任务,将每天访问多的数据预加载到redis中,冷数据就不放redis里面了
全表扫描
innodb_random_read_ahead: OFF顺序缓存区中的连续的数据页超过13
1.冷数据区域不够时,新查询数据过来,淘汰尾部。2.热数据区域不够时,冷数据1s后被访问,热数据移动到LRU链表头部。
分配扩容
数据库启动
极端情况,岂不是每次都要将冷/热数据先刷盘,再刷到缓存=2次IO
lru尾部定时刷回磁盘
buffer pool三种随机刷盘
加入一个节点后
缓存页不够淘汰
是否在flush链表中
默认:128Minnodb_buffer_pool_size建议设置到内存的70%~80%
缓存页
缓存页(冷数据区域)
free链表
1s之后再次被访问才调到热数据区域的表头
行
冷热区内存不够刷盘
定时任务
block_id=block01flush_pre=nullflush_next=block02
逻辑概念
free双向链表
free不够
3.合理设置buffer pool
flush双向链表
2.满足关系buffer pool大小=N*128*buffer pool个数
7.回写缓存到哈希表中
1.操作一行数据
缓存页(新)
生产优化策略
否
进入冷数据区 1.预读之后,1s没有被访问的2.全表查询等带来的,1s后没有访问的
从free链表脱离后直接进入LRU链表中
范围查询/如分页查询
局部性原理
2.chunk机制动态扩容缓冲池
6.从free链表中移除
2.如何判断哪些数据页是被缓存的
flush链表
4.如何判断哪些缓存页可清除
1.冷数据的占比innodb_old_blocks_ptc:默认37,大约3/8的位置。2.多久之后访问才能移动到热数据头innodb_old_blocks_time:默认1000ms。
刚加入到LRU时,先放在冷数据区域的表头
没有被访问移动到末尾
从free链表脱离后进入LRU链表
2.先从缓存页缓存中寻找
(4)buffer pool千次访问缓存命中率
IO线程
数据被修改->脏数据缓存页->脏页->对应描述数据进入flush链表(缓存页!=数据页)
1.表空间号:sql的database + table 解析出来2.数据页号:一致性算法算出来
热数据区域只有后3/4数据被访问时才会移动到表头
start=block01end=block02count=2
描述数量
innodb_read_ahead_threshold: 56顺序访问一个区中的多个数据页,访问数量超过这个阈值,加载下一个相邻区的数据页到缓存里去
热数据-缓存预加载
在2位置移除
(5)磁盘IO情况
表空间
LRU双向链表
1.如何判断哪些缓存页是空的
1.buffer pool由很多chunk组成,chunk大小由参数innodb_buffer_pool_chunk_size控制,默认128MB2.innodb_buffer_pool_instances控制buffer pool个数3.buffer pool总大小 = chunk大小 * 每个buffer pool包含的chunk数量 * buffer pool数量
block_id=block02free_pre=block01free_next=block03
直接释放掉内存
chunk128M
触发场景
LRU链表
全表查询加载/删除/加载很慢
1.buffer pool 总大小为机器的50%~60%
1.按理释放它
删除时,找尾部删除即可
同时加入到free链表中
0 条评论
下一页