当前位置: 首页 > news >正文

Buffer Pool运行机制理解

Buffer Pool机制理解

一、为什么使用Buffer Pool?

众所周知,磁盘数据是以数据页的形式来去读取的,一个数据页默认大小 16K,也就是说你本意只想读取一行数据,但是它会给你加载一页的数据到buffer pool里面。这样的话就能减少与磁盘的交互次数,从而提升效率。

二、什么是Buffer Pool?

  1. 是一块内存区域,当数据库操作数据的时候,把磁盘上的数据加载到buffer pool,对buffer pool数据进行增删改查,不直接和磁盘打交道。
  2. 默认大小 128M
SHOW VARIABLES LIKE '%innodb_buffer_pool_size%'; -- 查看buffer_pool大小 默认128M
SHOW VARIABLES LIKE '%innodb_old_blocks_pct%'; -- LRU链表冷热区域配置 默认3 7
SHOW VARIABLES LIKE '%innodb_old_blocks_time%'; -- LRU链表冷区域的数据隔多久可以放入到热区域
SHOW VARIABLES LIKE '%innodb_file_size%'; -- 单个logfile的大小 默认48M
SHOW VARIABLES LIKE '%innodb_log_file_in_group%'; -- 配置有几个logfile
SHOW VARIABLES LIKE '%innodb_log_buffer_size%'; -- redo log buffer的大小 默认16M
SHOW VARIABLES LIKE '%innodb_flush_log_at_trx_commit%'; -- redo log buffer 中的内容间隔多久刷新到磁盘, 默认1s

三、Buffer Pool运行机制

当我们读取数据的时候,如果buffer pool中不存在则会从磁盘加载到buffer pool,然后一直读取数据就会一直加载,所以buffer pool就会有爆满的时候。这时候就要采取淘汰策略,buffer pool采取的LRU(最近最少使用)淘汰策略。
在此之前先说的是,使用LRU策略淘汰的时候,就会出现下面的所演示的现象(有数据的控制块是不连续的),这时候再读取数据到buffer pool的时候要填充到哪个空白的区域?–就要用到free链表
在这里插入图片描述

1. free链表

主要管理空白区域,该链表会有一个基节点用于管理链表有多少空白的控制块,还有两个结点,一个连接头结点,一个连接尾结点。当读取数据到buffer pool的时候,会找free链表的头结点对应的控制块进行填充,当进行控制块淘汰的时候,空白的控制块就会连接free链表的尾结点。

2. flush链表

当我们进行update语句的时候,就会对数据进行修改,此时也是对buffer pool的数据进行修改,有数据进行修改又没刷新到磁盘的这页数据我们称为脏页。mysql后台线程会对这些脏页进行刷盘,但是要刷哪些页?此时就得靠flush链表了。
flush链表主要管理上面所说的脏页区域,该链表会有一个基节点用于管理链表有多少脏页的控制块,同样有两个结点,一个连接头结点,一个连接尾结点。当mysql后台线程进行刷盘的时候就会找到flush链表有哪些是脏页来进行刷盘。

3.lru链表

当我们读取一页的数据到buffer pool的时候,这一页的数据就会信息就会被记录到lru链表,再读取一页数据,后一页的数据的信息会插到之前的页之前。当读取的页又被用的话,也会插到链表的头结点,所以lru链表最靠前就是最近被使用的数据。当buffer pool满的时候,就会进行淘汰lru链表尾部的数据。

但是这样的lru链表是存在问题的:比如我们有那么几页是频繁查询的数据页始终位于lru链表的头部部分,此时我们执行一个查询数据量非常大的sql,首页会淘汰lru链表尾部的数据块,还是不够的话就会淘汰头部那些热点数据块。因此就会影响热点数据,所以要对lru链表进行升级。

4.升级版lru链表

在这里插入图片描述
升级版的lru链表会分为热数据区域和冷数据区域,占比为5:3,当我们对数据页进行操作时,会插入冷区域的头部,淘汰也是淘汰冷区域的尾部。那么冷区域的数据什么时候才能进入热区域呢?

首先数据页被访问进入冷区域的时候设为t1,该数据页再次被访问的时候设为t2,t2减去t1大于1s的时候就会被放入热数据区域。这样就能预防类似全表扫描这样的sql,对热数据产生的影响,因为一直替换的是冷区域的数据。

http://www.lryc.cn/news/359911.html

相关文章:

  • windows配置dns访问git , 加快访问速度保姆级教程
  • Solidity学习-投票合约示例
  • 前端Vue自定义支付密码输入框键盘与设置弹框组件的设计与实现
  • 【QEMU中文文档】1.1 支持的构建平台
  • 摄影后期照片编辑工具:LrC2024 for Mac/win 中文激活版
  • 通关!游戏设计之道Day20
  • 2024年上半年软件设计师试题及答案(回忆版)--选择题
  • 5.28.1 使用卷积神经网络检测乳腺癌
  • 【JavaScript脚本宇宙】JavaScript日期处理神器: 6款顶级库解析
  • C++基础编程100题-002 OpenJudge-1.1-04 输出保留3位小数的浮点数
  • Linux挂载硬盘
  • 用户购物性别模型标签(USG)之决策树模型
  • Mock的用法
  • 内网-win1
  • 中国电子学会(CEIT)2023年09月真题C语言软件编程等级考试三级(含详细解析答案)
  • golang线程池ants-四种使用方法
  • Flutter开发效率提升1000%,Flutter Quick教程之对组件进行拖拽与接收
  • 揭秘小程序商城的团购奇迹:独特模式引领盈利新纪元
  • ssm_mysql_高校自习室预约系统(源码)
  • AI自动化办公:批量将Excel表格英文内容翻译为中文
  • PPT 隐藏开启对象图层
  • PHP火狼大灌篮游戏源码微信+手机wap源码带控制
  • 推荐几首听无数遍也听不腻的好歌(1)
  • 【全开源】Java短剧系统微信小程序+H5+微信公众号+APP 源码
  • 基于Springboot驾校预约平台小程序的设计与实现(源码+数据库+文档)
  • python列表基本运算
  • Pytorch实用教程:pytorch中nn.Linear()用法详解 | 构建多层感知机 | nn.Module的作用 | nn.Sequential的作用
  • 如何利用unicloud阿里云云函数实现文件包括图片或文件上传,unicloud云函数写法一览
  • Django序列化器中is_valid和validate
  • 关于Golang中自定义包的简单使用-Go Mod