buffer pool随笔

Bufferpool是数据库管理系统中的内存区域,用于缓存数据页以提升查询性能。当数据页加载到Bufferpool,会在LRU链表头部记录,频繁访问的页面保留在热数据区。脏页(数据修改后未写回磁盘)加入flush链表,等待刷新。Bufferpool满时,使用LRU和free链表淘汰不常用页面。脏页刷新可通过参数innodb_flush_neighbors控制相邻页刷新策略。
摘要由CSDN通过智能技术生成

buffer pool 是什么?

一块内存:默认128M,用于缓存数据的缓冲区

  • 作用:提高查询性能,因为是第一次查找是一页(16kb)的数据从磁盘加载入缓冲区,如果第二次查找的数据也在这页内容里,那么第二次就会直接从buffer pool 里面查询, 提高了查询效率

数据页

  • 磁盘文件分为很多数据页,一个数据页有很多行数据
  • 数据页默认大小16kb

缓存页

  • buffer pool中存放的数据页叫缓存页,和磁盘数据页对应,都是16kb
  • 缓存页的数据是从磁盘加载到buffer pool中的

LRU链表

记录使用缓冲页频率(当buffer pool满存后,用于判断哪些适合淘汰刷新

  • 只要从磁盘中加载数据页到缓存页,就会把这个缓存页的描述数据块放到LRU链表的头部,那么,只要缓存页有数据,他都会在LRU里,而且最近被加载数据的缓存页都会被放到LRU链表的头部,假设某个缓存页的描述数据块在LRU链表的表尾,后续只要查询或者修改了这个缓存页的数据,就会把这个缓存页的描述数据块移动到LRU链表的头部。即是说,只要最近被访问过的缓存页一定是在LRU链表的头部。
  • LRU链表分为热数据区和冷数据区,冷数据区占了总链表的37%
    • 冷数据区是不常访问的缓存页
    • 热数据区是经常访问的缓存页
  • 数据页加载到缓存页后,在1s之后,访问该缓存页,该缓存页会被移动到热数据区头部
  • 数据页刚加载到缓存页后,在1s之内,访问该缓存页,该缓存页是不会被移动到热数据区头部的(防止全表扫描速度快,误判)

free链表

表示哪里有空闲页的链表

注:buffer pool满存后会如何处理?

  • 淘汰机制:将buffer pool中不常用的那页数据淘汰掉 即LRU链表的尾部,但是淘汰是无序淘汰的,你不知道buffer pool中哪里是空闲哪里是不空闲的

这时free链表的作用就体现出来了

free链表的结构

  • 基节点:
    – 存放链表总长个数
    – 存放头节点
    – 存放尾节点
  • 控制块:
    –指向对应的缓冲区内每页地址,表示该页空闲,若有新的空白页则加入到链表尾部

flush链表

  • 实际上要更新的数据页都会在Buffer Pool的缓存页里,直接在内存中执行增删改的操作。更新完成后缓存页里面的数据就修改了,但是磁盘里面数据还没有变啊。那么此时缓存页里的数据和磁盘上的数据页里的数据,就出现了不一致,于是我们便说这个缓存页里的数据成为了脏数据,这个缓存页也变成了脏页

  • 这个flush链表本质也是通过缓存页的描述数据块中的两个指针,让被修改过的缓存页的描述数据块,组成一个双向链表。

  • 凡是被修改过的缓存页,也就是我们所说的脏页,都会把他的描述数据块加入到flush链表中去,这些脏页呢后续都是要flush刷新到磁盘上去的,所以flush链表的结构跟free链表几乎是一样的。

  • 脏页刷新参数

    当mysql进行脏页刷盘的时候可能会刷新临接数据页:意思是当MySQL将某脏页刷新回磁盘时,是否也以相同的态度将该脏页邻接的脏页一并刷新回磁盘。可以通过参数innodb_flush_neighbors控制该过程。

    设置为0时表示,禁用刷新邻接的功能。
    设置为1时表示,以相同的态度刷新其邻接的脏页。
    设置为2时表示,以相同的程度刷新脏页。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值