InnoDB的BufferPool


title: “InnoDB的BufferPool”
createTime: 2022-03-06T15:52:41+08:00
updateTime: 2022-03-06T15:52:41+08:00
draft: false
author: “ggball”
tags: [“mysql”]
categories: [“db”]
description: “”

InnoDB的BufferPool

为什么需要缓存?

因为存储引擎需要访问某一条记录时,是通过页作为基本单位读取到内存的,但是如果每次就因为一两条数据而把一页的数据从磁盘读取到内存有点耗费性能了,这样就多了缓存的概念,在进行完读写访问之后并不着急把该页对应的内存空间释放掉,而是将其 缓存 起来,这样将来有请求再次访问该页面时,就可以省去磁盘 IO 的开销了。

Buffer Pool

概念

在 MySQL 服务器启动的时候就向操作系统申请了一片连续的内存,他们给这片内存起了个名,叫做 Buffer Pool (中文名是 缓冲池 )。

默认情况下 Buffer Pool 只有 128M 大小

参数配置

[server] 
innodb_buffer_pool_size = 268435456

内部组成

image-20220223112158274

控制块 ,这些控制块包括该页所属的表空间编号、页号、缓存页在 Buffer Pool 中的地址、链表节点信息、一些锁信息以及 LSN 信息,控制块和缓存页是一一对应的,它们都被存放到 Buffer Pool 中,其中控制块被存放到 Buffer Pool的前边,缓存页被存放到 Buffer Pool 后边。

free链表的管理

为了让存储引擎能区分,哪些缓存页被用过,哪些没有被用过,没有被用过的缓存页就用来装要被缓存的页嘛。InnoDB的大叔又给设计出了free链表,来解决这个问题。

free链表:把所有空闲的缓存页对应的控制块作为一个节点放到一个链表中,这个链表也可以被称作 free链表。

image-20220223140522642

流程:在缓存池初始化时,大量的缓存页是都没有被使用过的,他们的控制块都会被加入到链表中(个人认为是拿到控制块的物理地址),当有缓存需要填充缓存页,那么先从free链表取一个控制块,填充控制块信息(就是该页所在的表空间、页号之类的信息),之后就是将控制块从free链表移除。

flush链表管理

背景:当我们修改数据时,会先修改缓存池中的缓存页,而不会立即修改对应磁盘上的页,这时候缓存池的页的数据和磁盘上的页的数据不一致,这个页就成为脏页。(未来会同步这个页的数据)

概念:脏页的控制块组成的链表

组成

image-20220223161956183

LRU(Least Recently Used)链表管理

概念:由于这个链表是为了 按照最近最少使用 的原则去淘汰缓存页的,所以这个链表可以被称为 LRU链表

组成:控制块组成的链表,前一部分是热数据(young区域),后面一部分为冷数据(old区域)

image-20220224085834805

过程:只要我们使用到某个缓存页,就把该缓存页调整到 LRU链表 的头部,这样 LRU链表 尾部就是最近最少使用的缓存页喽

##刷新脏页到磁盘

从 LRU链表 的冷数据中刷新一部分页面到磁盘。

从 flush链表 中刷新一部分页面到磁盘。

多个Buffer Pool实例

为了能在多线程环境下,提高查询下频率,缓存池会被分为多个小的缓存池。

当innodb_buffer_pool_size的值小于1G的时候设置多个实例是无效的,InnoDB会默认把innodb_buffer_pool_instances 的值修改为1。而我们鼓励在 Buffer Pool 大小或等于1G的时候设置多个 Buffer Pool 实例

innodb_buffer_pool_chunk_size

在 MySQL 5.7.5 之前, Buffer Pool 的大小只能在服务器启动时通过配置 innodb_buffer_pool_size 启动参数来调整大小,在服务器

运行过程中是不允许调整该值的。不过设计 MySQL 的大叔在 5.7.5 以及之后的版本中支持了在服务器运行过程中调整 Buffer Pool

大小的功能,但是有一个问题,就是每次当我们要重新调整 Buffer Pool 大小时,都需要重新向操作系统申请一块连续的内存空间,

然后将旧的 Buffer Pool 中的内容复制到这一块新空间,这是极其耗时的。所以设计 MySQL 的大叔们决定不再一次性为某个 Buffer

Pool 实例向操作系统申请一大片连续的内存空间,而是以一个所谓的 chunk 为单位向操作系统申请空间。也就是说一个 Buffer

Pool 实例其实是由若干个 chunk 组成的,一个 chunk 就代表一片连续的内存空间,里边儿包含了若干缓存页与其对应的控制块,画个图表示就是这样:

image-20220223190005052

innodb_buffer_pool_chunk_size的值只能在服务器启动时指定,在服务器运行过程中是不可以修改的

总结

  1. 磁盘太慢,用内存作为缓存很有必要。

  2. Buffer Pool 本质上是 InnoDB 向操作系统申请的一段连续的内存空间,可以通过innodb_buffer_pool_size 来调整它的大小。

  3. Buffer Pool 向操作系统申请的连续内存由控制块和缓存页组成,每个控制块和缓存页都是一一对应的,在填充足够多的控制块和缓存页的组合后, Buffer Pool 剩余的空间可能产生不够填充一组控制块和缓存页,这部分空间不能被使用,也被称为 碎片 。

  4. InnoDB 使用了许 链表 来管理 Buffer Pool 。

  5. free链表 中每一个节点都代表一个空闲的缓存页,在将磁盘中的页加载到 Buffer Pool 时,会从 free链表 中寻找空闲的缓存页。

  6. 为了快速定位某个页是否被加载到 Buffer Pool ,使用 表空间号 + 页号 作为 key ,缓存页作为 value ,建立哈希表。

  7. 在 Buffer Pool 中被修改的页称为 脏页 ,脏页并不是立即刷新,而是被加入到 flush链表 中,待之后的某个时刻同步到磁盘上。

  8. LRU链表 分为 young 和 old 两个区域,可以通过 innodb_old_blocks_pct 来调节 old 区域所占的比例。首次从磁盘上加载到 Buffer Pool 的页会被放到 old 区域的头部,在 innodb_old_blocks_time 间隔时间内访问该页不会把它移动到 young 区域头部。在 Buffer Pool 没有可用的空闲缓存页时,会首先淘汰掉 old 区域的一些页。

  9. 我们可以通过指定 innodb_buffer_pool_instances 来控制 Buffer Pool 实例的个数,每个 Buffer Pool 实例中都有各自独立的链表,互不干扰。

  10. 自 MySQL 5.7.5 版本之后,可以在服务器运行过程中调整 Buffer Pool 大小。每个 Buffer Pool 实例由若干个 chunk 组成,每个 chunk 的大小可以在服务器启动时通过启动参数调整。

  11. 可以用下边的命令查看 Buffer Pool 的状态信息:

    SHOW ENGINE INNODB STATUS\G
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/89550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Yarn的状态机框架分析

Yarn的状态机框架分析 什么是状态机 状态机(State Machine),是有限状态自动机的简称。简单解释:给定一个状态机,同时给定它的当前状态和输入,那么输出状态时可以明确的运算出来的。 yarn中的状态机 YARN将各种处理逻辑抽象成事…

Unity-Input System新输入系统插件学习

1.键盘、鼠标操作 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.UI;public class NewInputSystem : MonoBehaviour {public float SpaceKeyValue;public float RightMouseValue;public…

【每日一题】9.25 App测试和web测试有什么区别

“App 测试”和“Web 测试”是指软件测试的不同类型,每个都专注于软件开发的特定方面: 1. **App 测试(应用程序测试)**: - **平台**:这种类型的测试主要侧重于移动应用程序,包括为 iOS&#xf…

LaTex模板免费下载网站

LaTex模板免费下载网站 在进行文档排版时候,有时需要对不同类型文章的格式进行编辑,本博文推荐一个免费下载LaTex模板的网站。 一、网站地址 链接: LaTex模板网址:http://www.latextemplates.com/ 二、模板类型 模板类型如图2和图3所示。…

APACHE NIFI学习之—UpdateAttribute

UpdateAttribute 描述: 通过设置属性表达式来更新属性,也可以基于属性正则匹配来删除属性 标签: attributes, modification, update, delete, Attribute Expression Language, state, 属性, 修改, 更新, 删除, 表达式 参数: 如下列表中,必填参数则标识为加粗. 其他未加…

(PTA) 习题3-1 比较大小 (10分)

​ 本题要求将输入的任意3个整数从小到大输出。 输入格式: 输入在一行中给出3个整数&#xff0c;其间以空格分隔。 输出格式: 在一行中将3个整数从小到大输出&#xff0c;其间以“->”相连。 输入样例: 4 2 8输出样例: 2->4->8代码如下&#xff1a; #include<…

回归预测 | Matlab实现基于MIC-BP最大互信息系数数据特征选择算法结合BP神经网络的数据回归预测

回归预测 | Matlab实现基于MIC-BP最大互信息系数数据特征选择算法结合BP神经网络的数据回归预测 目录 回归预测 | Matlab实现基于MIC-BP最大互信息系数数据特征选择算法结合BP神经网络的数据回归预测效果一览基本介绍研究内容程序设计参考资料 效果一览 基本介绍 Matlab实现基于…

C++ 类的前置声明

最近在仿照muduo的网络库源代码写自己的网络服务器&#xff0c;当初想着整个项目分模块去写&#xff0c;最后再和主程序链接&#xff0c;正好升入理解一下编译链接的过程&#xff0c;但是现在发现每个模块的内容其实也不是很多&#xff0c;实际上没有必要分模块去写。然后在写的…

如何将48位立即数加载到ARM通用寄存器中?

安全之安全(security)博客目录导读 问题&#xff1a;如何将48位立即数加载到ARM通用寄存器中? AArch64执行状态中支持的指令集称为A64。所有A64指令的宽度都是32位。Move(宽立即数)被限制为16位立即数。 如果使用以下指令将一个48位的值赋给一个通用寄存器&#xff0c;会得到…

【EI会议征稿】第八届能源系统、电气与电力国际学术会议(ESEP 2023)

第八届能源系统、电气与电力国际学术会议&#xff08;ESEP 2023&#xff09; 2023 8th International Conference on Energy System, Electricity and Power 第八届能源系统、电气与电力国际学术会议&#xff08;ESEP 2023&#xff09;定于2023年11月24-26日在中国武汉隆重举…

【斯坦福cs324w】中译版 大模型学习笔记十 环境影响

环境影响 温室气体排放水足迹&#xff1a;数据中心使用水进行冷却&#xff1b;发电需要用水释放到环境中的化学物质很多是对人类有害的 如何计算数据中心能源消耗 简单表示形式 模型训练过程 参考资料 datawhale so-large-lm学习资料

PostGreSql中统计表中每天的数据,并统计每天的回复数,未回复数以及未回复占比(显示百分比)

前言 要在 PostgreSQL 中统计表中每天的数据&#xff0c;并统计每天的回复数、未回复数以及未回复占比&#xff0c;并以百分比形式显示&#xff0c;你可以使用以下 SQL 查询。假设你有一个名为 "messages" 的表&#xff0c;其中包含消息的时间戳列 "timestamp&…

【MySQL】如何配置复制拓扑?

前言配置大框架配置复制主服务器&#xff08;master&#xff09;配置复制从属服务器&#xff08;slave&#xff09;复制过滤规则感谢 &#x1f496; 前言 关于MySQL中的复制技术相关内容&#xff0c;可以看看这些文章&#xff1a; 【MySQL】MySQL中的复制技术是什么&#xff1…

英语——谐音篇——单词——单词密码

记忆即联结&#xff0c;只要能建立有效的联结&#xff0c;就能很好地记住。在现实生活中&#xff0c;声音的联结模式能很好地帮助我们记忆。几乎每个学生都曾用谐音的方法记忆一些事物&#xff0c;但很多人都没有意识到&#xff0c;我们每个人都可以通过一定的练习&#xff0c;…

超声波乳化具有什么特点(优点)?

梵英超声(fanyingsonic)探针式超声波乳化棒 超声波乳化是通过探针式超声波探头&#xff0c;高强度超声波耦合到液体中并产生声空化。超声波或声空化产生高剪切力&#xff0c;提供将大液滴破碎成纳米尺寸液滴所需的能量。梵英超声(fanyingsonic)提供各种探头式超声波乳化棒和配件…

skywalking 整合

安装sw docker 安装&#xff0c; compose 11800是外侧服务向skywaling投送数据的接口 12800是用来和web界面交互数据的接口 8080是ui界面商品 安装后&#xff0c;访问8080 怎么接入服务 下载 基于java的探针技术自动的上报指标数据&#xff0c;不用改源代码 要改下配置 后端…

与机器学习相比,人类的学习包括视觉、听觉、触觉、嗅觉、味觉的串并行混合学习...

视觉学习、听觉学习和触觉学习是人类感知和认知过程中的三个重要方面。 视觉学习&#xff1a;视觉学习是通过视觉感知信息进行学习和认知的过程。人类视觉系统能够感知并解读光线的反射或发射&#xff0c;从而获取关于物体、场景和环境的信息。视觉学习涉及识别、分类、空间感知…

Linux系统文件的三种time(atime/ctime/mtime)

使用Go操作文件&#xff0c;根据创建时间(或修改时间)进行不同处理。 在Mac上&#xff0c;文件相关的结构体字段在syscall/ztypes_darwin_arm64.go下的Stat_t: type Stat_t struct {Dev int32Mode uint16Nlink uint16Ino uint64Uid …

微信小程序页面栈超出导致页面卡死

微信小程序页面栈不能超出10个 超出10个之后无法进行点击选择跳转 解决方法&#xff1a; 跳转的时候&#xff0c;判断之前页面栈里是否存在要跳转的页面&#xff0c; 如果存在之前页面&#xff0c;就navigateBack返回之前页面&#xff0c; 如果不存在之前页面&#xff0c;判断…

精通git,没用过git cherry-pick?

前言 git cherry-pick是git中非常有用的一个命令&#xff0c;cherry是樱桃的意思&#xff0c;cherry-pick就是挑樱桃&#xff0c;从一堆樱桃中挑选自己喜欢的樱桃&#xff0c;在git中就是多次commit中挑选一个或者几个commit出来&#xff0c;也可以理解为把特定的commit复制到…