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

【MySQL进阶之路】BufferPool底层设计(下)

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!

在我后台回复 「资料」 可领取编程高频电子书
在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!

在这里插入图片描述

什么时间将缓存页刷入磁盘呢?

在 MySQL 中会有一个后台线程运行定时任务,定时将 LRU 链表的 冷数据区域尾部 的一些缓存页刷入磁盘里去,清空这几个缓存页,将他们加入到 free 链表中(free 链表存放的就是 BufferPool 中的空缓存页的地址)

并且这个后台线程也会在 MySQL 空闲时,将 flush 链表(flush 链表存放的是 BufferPool 中被修改过的缓存页,也称为脏页,脏页都是需要刷回磁盘的)中的缓存页都刷入磁盘中

在 BufferPool 中存储的是什么数据呢?

我们在 MySQL 中看到的数据是一个一个的表,表中有一行一行的数据

那么难道 BufferPool 中存储的是一行一行的数据吗?

肯定不是的,我们可以来思考一下,如果 BufferPool 存储一行一行的数据,那么每次一修改数据时,都需要去磁盘中读取一行数据到 BufferPool 中,而磁盘 IO 是很慢的,一次磁盘 IO 只读取一行数据显然不划算!

所以,在 MySQL 的设计中, BufferPool 存储的其实是 数据页

MySQL 中将很多行的数据放在一个数据页中,当数据在磁盘文件中存储的时候,就是存储的很多数据页:

请添加图片描述

当数据页进入到 BufferPool 之后,除了数据页之外,每个缓存也还会有对应的描述数据,存储一些数据页的信息,BufferPool 默认大小是 128MB,而数据页大小是 16KB,缓存页大小与数据页大小是相等的,如下:

请添加图片描述

BufferPool 中缓存页的管理(free、flush链表)

MySQL 在启动的时候,就会在内存区域中初始化 BufferPool,此时 BufferPool 中会直接划分出一个一个的缓存页,初始时所有的缓存也都为空

那么 BufferPool 如何来管理这些缓存页呢,怎么知道哪些缓存页是空的?(free 链表)

BufferPool 通过 free 链表来管理空的缓存页,是一个双向链表,由缓存页的描述数据组成,里边有一个 基础节点 ,可以通过基础节点快速找到开始节点和结束节点,并且基础节点中记录了 free 链表的总节点数:

请添加图片描述

flush 链表

当缓存页中数据被修改之后,这个缓存页就变为了脏页,这些脏页此时和磁盘中的数据是不一致的,因此称为 脏页

这些脏页就是由 BufferPool 中的 flush 链表来管理的,flush 链表和 free 链表结构一样,都是双向链表

请添加图片描述


http://www.kler.cn/news/232498.html

相关文章:

  • 【GAMES101】Lecture 19 相机
  • java——学习并推荐java8
  • 猫头虎分享已解决Bug :内存泄漏(Memory Leak)
  • Kubernetes实战(二十七)-HPA实战
  • Web Services 服务 是不是过时了?创建 Web Services 服务实例
  • 【Linux】SystemV IPC
  • CTFshow web(命令执行 41-44)
  • WPF 中 Loaded 和 Closing 窗口事件
  • K210如何下载程序
  • LDAR管理系统解决方案
  • 90.Go语言中实现可选参数的几种方法:可变长参数、使用Map、结构体和函数选项模式
  • macbookpro和macbookair的区别?cleanmymac 怎么清理mac空间
  • sqlite3数据库操作接口详细整理,以及常用的数据库语句
  • vscode debug无法直接查看eigen变量的问题(解决方法)
  • 2402d,d的静态构造器
  • CSS之盒子模型
  • HttpClient | 支持 HTTP 协议的客户端编程工具包
  • 【机器学习】合成少数过采样技术 (SMOTE)处理不平衡数据(附代码)
  • 懒人精灵 之 Lua 捕获 json解析异常 ,造成的脚本停止.
  • 在Python中读写Kafka队列
  • Qt应用软件【协议篇】TCP示例
  • RPC技术分享
  • 【杂谈】年尾做了这件事,我后悔了.......
  • git flow与分支管理
  • 【大数据】Flink 中的 Slot、Task、Subtask、并行度
  • 利用路由懒加载和CDN分发策略,对Vue项目进行性能优化
  • Ubuntu in VMware的问题
  • 对比 elasticsearch 和 mysql
  • Qt网络编程-QTcpServer的封装
  • 前端JavaScript篇之对原型、原型链的理解、原型修改、重写、原型链指向