【MySQL进阶(三)】 InnoDB体系架构之内存池(buffer pool)

InnoDB体系架构之内存池

  • 一、InnoDB 体系结构
  • 二、缓冲池 buffer pool
    • 内部结构
    • free 链(管理空闲缓冲页)
      • 怎么知道数据页是否被缓存?
    • flush 链表(管理脏页)
      • 1. 脏页
      • 2. 链表结构
      • 3. 刷盘时机
    • LRU 链表(控制数据热度,淘汰策略)

一、InnoDB 体系结构

下图显示了 InnoDB 存储引擎的体系结构。

请添加图片描述
图中的内存池主要负责以下工作:

  • 维护所有进程/线程需要访问的多个内部数据结构;
  • 缓存磁盘上的数据,方便快速的读取,同时在对磁盘文件的数据修改之前在这里缓存。
  • 重做日志(redo log)缓冲。

图中的后台线程主要作用是负责刷新内存池中的数据,保证缓存池中的内存缓存是最近的数据。此外将已修改的数据文件刷新到磁盘文件中,同时保证在数据库中发生异常的情况下 InnoDB 能恢复到正常运行状态。(如:Master Thread:负责将缓存池中的数据异步刷新到磁盘;IO Thread:异步处理IO请求,提高数据库的性能

二、缓冲池 buffer pool

InnoDB 存储引擎是基于磁盘进行存储的,并将其中的记录按照页的方式进行管理。由于【磁盘速度】和【内存速度】相比根本不值一提,所以一般基于磁盘的数据库系统通常使用缓冲技术来提高数据库的整体性能。

缓冲池简单来说就是一块内存区域。在数据库中进行读取页的操作,首先将磁盘中读到的页存放到缓冲池中,这个过程称为将页【FIX】在缓冲池中。下一次再读相同的页时,首先判断是否在缓冲池中,不再的话再读取磁盘中的页。

对于 InnoDB 存储引擎而言,其缓冲池的配置是通过参数 innodb_buffer_pool_size 来设置的。

my.cnf 下的配置

在这里插入图片描述

这个数据是字节数,转换一下就是256MB。
在这里插入图片描述

内部结构

整个 buffer pool 是由缓冲页和控制块组成的:

  • 缓冲页:buffer pool 中存放的【数据页】称之为【缓冲页】,和磁盘上的数据页是一一对应的,都是16KB,缓冲页的数据,是从磁盘上加载到 buffer pool 当中的一个完整页。
  • 控制块:他是缓冲页【描述信息】,这一块区域保存的是数据页所属的表空间号,数据页编号,数据页地址,以及一些链表相关的节点信息等,每个控制块大小是缓冲页的5%左右,大约是800个字节。

其内部结构如下,buffer pool 的前一部分存储【控制块】,后一部分存储【缓冲页】,如果中间有未被利用的空间,就叫他【内存碎片】吧。

在这里插入图片描述

buffer pool 的初始化:数据库会在启动的时候,安装配置中的 buffer pool 的大小,去向操作系统申请一块内存,作为 buffer pool 的内存区域,然后会按照默认的缓存页的大小【16KB】以及对应的【800字节左右】的【控制块】的大小,在buffer pool 中划分出一个一个的缓存页和一个一个与其对应的描述数据(控制块)。此时的buffer pool 像一个干净的本子,没有书写任何内容。

free 链(管理空闲缓冲页)

InnoDB 在设计之初,将所有的【空闲的缓冲页】所对应的【控制块】作为一个个的节点,形成一个链表,这个链表就是free链,翻译过来就是空闲链表。如下图所示:

在这里插入图片描述
由上图可知,free 链表是一个双向链表,链表上除了控制块以外,还有一个基础节点,存储了free 链由多少个描述信息块,也就是由多少个空闲的缓存页,以及指向链表头尾的指针。

当我们加载数据的时候,会从free链中找到空闲的缓存页,把数据页的【表空间和数据页】号写入【控制块】。

加载数据到缓存页后,会把缓存页对应的控制块从free链表中移除。

怎么知道数据页是否被缓存?

已经有了 free 链表用来【保存空闲的页】,但是,当下一次访问时,要如何知道当前要访问的页是不是已经被缓存了,最直接的思路就是将buffer poll 里面的缓存数据【全部遍历一遍】。显然不合理。

事实上,使用【表空间号+页号】即可确定唯一的页,那就可以直接设计一个【hash表】,使用【表空间号+页号】当做key,使用【控制块地址】做value,每次查询的时候只需要将key进行查找即可,时间复杂度为O(1),这样即可快速定位到缓存的页。

大致流程如下图所示:

在这里插入图片描述

flush 链表(管理脏页)

1. 脏页

在 SQL 的执行过程中,无论是增删改查,都是优先在 buffer pool 中进行的,这样可以极大的保障执行效率。但是同样会有一个问题,假如我们对缓存页中的某些数据进行了修改(执行了一条update语句),就会导致 buffer pool 中的缓冲页和磁盘中的数据页【数据不一致】,那么此时的缓冲页就称为【脏页】。当然,这也就说明了,脏页的数据是要刷到磁盘上的。

2. 链表结构

在这里插入图片描述

  • flush 链表同样是一个双向链表,链表节点是被【修改过的缓冲页(脏页)】的控制块。
  • 和 free 链表一样,flush 链表也有一个基础结点,链接首尾结点,并存储了有多少个控制块。

3. 刷盘时机

后台会有专门的线程每隔一段时间就把 flush 链表中的脏页刷入磁盘中,刷新的速率取决于当前系统是否繁忙。在这样的机制下,万一系统崩溃,是会产生数据不一致的问题的,没有刷入磁盘的数据就会丢失,而MySQL通过日志系统解决了这个问题。(undo log 记录的是数据操作前的样子redo log 记录的是数据被操作后的样子;redo log 是 Innodb 存储引擎特有;bin log 记录的是整个操作记录)

LRU 链表(控制数据热度,淘汰策略)

buffer pool 的内存是有限的,缓存只是数据的中转站,当数据量很大以后,buffer pool 只能容纳一部分数据,当需要更多的空间缓存【新的数据页】的时候,我们需要将最近最少使用的【缓冲页淘汰掉】,这就是【LRU淘汰算法】。对InnoDB而言,则是通过【LRU链表】来完成此功能的,结构和上面的 free、flush 基本一致,只是负责的功能不一样而已。

在这里插入图片描述可以通过 show engine innodb status 语句来查看当前 InnoDB 的状态。

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

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

相关文章

影视行业案例 | 燕千云助力大地影院集团搭建智能一体化IT服务管理平台

影视行业过去三年受新冠肺炎疫情影响,经历了一定程度的冲击和调整,但也展现出了强大的韧性和潜力。2023年中国影视产业规模可能达到2600亿元左右,同比增长11%左右。影视行业的发展趋势主要表现在内容创新、模式创新和产业融合三个方面&#x…

ICC2如何计算Gate Count?

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?知识星球入口 我们认为gate count等于standard cell(非physical only)总面积 / 最小驱动二输入与非门面积。 ICC2没有专门的命令去报告gate count,只能自己计算,使用report_d…

Jasper裁员,成也GPT,败也GPT

大家好! 我是老洪。 今天来聊一聊人工智能(artificial intelligence),简称AI。 当前的AI可谓是热火朝天, 自从ChatGPT发布以来,引起了广泛的关注和热情, 许多公司和研究者都试图将其应用于自己的产品或研究中。 按理说…

Redis高级篇之布隆过滤器

版本 SpringBoot 2.6.1Mybatis-Plus 3.5.3.1Guava 23.0 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…

面试题:什么是闭包?

一、怎么理解闭包&#xff1f; 简单理解&#xff1a;闭包 内层函数 外层函数的变量 下面是一组简单的闭包代码&#xff1a; function outer() {let count 1function inner() {console.log(count)}inner() } outer()闭包有两个注意点&#xff1a; 闭包一定有return吗&#x…

如何利用设备数字化平台推动精益制造?

人工智能驱动技术的不断发展&#xff0c;尤其是基于机器学习的预测分析工具的使用&#xff0c;为制造业带来了全新的效率和价值水平。一直以来&#xff0c;精益生产&#xff08;也叫精益制造&#xff09;在制造业中扮演着重要角色&#xff0c;而现在通过与工业 4.0的融合&#…

word怎么转换成pdf?分享几种转换方法

word怎么转换成pdf&#xff1f;将Word文档转换成PDF文件有几个好处。首先&#xff0c;PDF文件通常比Word文档更容易在不同设备和操作系统上查看和共享。其次&#xff0c;PDF文件通常比Word文档更难以修改&#xff0c;这使得它们在需要保护文件内容的情况下更加安全可靠。最后&a…

【无标题】python和Java 企业微信群发消息

python企业微信群发消息 GitHub - LinuxSuRen/phoenix.webui.framework: 基于WebDriver的WebUI自动化测试框架 #! -*- coding: utf-8 -*- """ Author: ZhenYuSha Create type_time: 2020-2-24 Info: 定期向企业微信推送消息 """ import reques…

Java 实现冒泡排序

Java 实现冒泡排序 一、原理二、代码实现三、运行结果 一、原理 冒泡排序是一种简单但效率较低的排序算法。其核心思想是通过相邻元素之间的比较和交换来逐渐将最大的元素“冒泡”到列表的最后。每一轮比较都会确定一个最大的元素的位置&#xff0c;因此需要进行 n-1 轮比较&a…

C++智能指针

unique_ptr #include <iostream> #include <memory> using namespace std; int main() {//智能指针unique_ptr 原始指针void* int* char*// 1. 在任意时刻,都只能有一个指针管理内存// 2. 在指针超出作用域时,会自动释放// 3. 指针类型不可拷贝,只可以move// …

在Mac上搭建Gradle环境

在Mac上搭建Gradle环境&#xff1a; 步骤1&#xff1a;下载并安装Java开发工具包&#xff08;JDK&#xff09; Gradle运行需要Java开发工具包&#xff08;JDK&#xff09;。您可以从Oracle官网下载适合您的操作系统版本的JDK。请按照以下步骤进行操作&#xff1a; 打开浏览器…

kubernetes调试利器——kubectl debug工具

通常情况下&#xff0c;业务容器所使用的镜像是非常精简的&#xff0c;而一旦业务容器出现问题&#xff0c;通过kubectl exec进入到容器时&#xff0c;我们会发现自己需要使用的工具都没有&#xff0c;也无法通过apt, apt-get, yum等包管理工具下载需要的工具。 想要解决这个尴…

【NLP】语音识别 — GMM, HMM

一、说明 在语音识别的深度学习&#xff08;DL&#xff09;时代之前&#xff0c;HMM和GMM是语音识别的两项必学技术。现在&#xff0c;有将HMM与深度学习相结合的混合系统&#xff0c;并且有些系统是免费的HMM。我们现在有更多的设计选择。然而&#xff0c;对于许多生成模型来说…

C语言---每天小练习,从大到小输出

题目&#xff1a;从大到小输出 写代码将三个整数数按从大到小输出。 例如&#xff1a; 输入&#xff1a;2 3 1 输出&#xff1a;3 2 1 int main() {// 初始化int a 0;int b 0;int c 0;int d 0;scanf("%d %d %d", &a, &b, &c);if (a < b) {…

力扣算法数学类—剑指 Offer 16. 数值的整数次方

目录 剑指 Offer 16. 数值的整数次方 题解&#xff1a; 知识点&#xff1a; 代码&#xff1a; 结果&#xff1a; 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数&#xff08;即&#xff0c;xn&#xff09;。不得使用库函数&#xff0c;同时不需要考虑大数问题。 示例…

【Matplotlib 绘制直方图】

使用 Matplotlib 绘制直方图 在数据分析和数据可视化中&#xff0c;直方图是一种常见的图表类型&#xff0c;用于展示数据的分布情况。Python 的 Matplotlib 库为我们提供了方便易用的功能来绘制直方图。 绘制直方图 下面的代码展示了如何使用 Matplotlib 绘制一个直方图&am…

UE使用UnLua(二)

1.前言 最近也是比较忙&#xff0c;忘了来更新了&#xff0c;好多都是开了头断更的&#xff08;狗头&#xff09;&#xff0c;今天抽空再更一篇&#xff01;&#xff01; 这篇讲一下在UnLua中覆盖蓝图事件&#xff08;函数&#xff09;&#xff0c;及按钮、文本控件的一些使用…

Node.js 安装与版本管理(nvm 的使用)

安装 Node.js Node.js 诞生于 2009 年 5 月&#xff0c;截至今天&#xff08;2022 年 3 月 26 号&#xff09;的最新版本为 16.14.2 LTS 和 17.8.0 Current&#xff0c;可以去官网下载合适的版本。 其中&#xff0c;LTS&#xff08;Long Term Support&#xff09; 是长期维护…

3的幂,给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false。

题记&#xff1a; 给定一个整数&#xff0c;写一个函数来判断它是否是 3 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 整数 n 是 3 的幂次方需满足&#xff1a;存在整数 x 使得 n 3^x 示例 1&#xff1a; 输入&#xff1a;n 27 输出…

四元数

public static Quaternion Euler(Vector3 euler); 传入一个向量&#xff0c;使物体旋转&#xff0c;如&#xff1a; cube.transform.rotationQuaternion.Euler(new Vector3(0,30,0)); 值得注意的是&#xff1a;Unity中组件Transform的Rotation实际上是Quaternion类型的 publ…