【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…

面试题:什么是闭包?

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

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

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

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

word怎么转换成pdf?将Word文档转换成PDF文件有几个好处。首先,PDF文件通常比Word文档更容易在不同设备和操作系统上查看和共享。其次,PDF文件通常比Word文档更难以修改,这使得它们在需要保护文件内容的情况下更加安全可靠。最后&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; 打开浏览器…

【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;同时不需要考虑大数问题。 示例…

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; 是长期维护…

【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境

知识点&#xff1a;简单了解K210芯片 2018年9月6日,嘉楠科技推出自主设计研发的全球首款基于RISC-V的量产商用边缘智能计算芯片勘智K210。该芯片依托于完全自主研发的AI神经网络加速器KPU,具备自主IP、视听兼具与可编程能力三大特点,能够充分适配多个业务场景的需求。作为嘉楠科…

详解Mybatis之动态sql问题

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 Maven版本&#xff1a;apache-maven-3.6.3 Mybatis版本&#xff1a;3.5.6 文章目录 一. 在sql映射文件中如何写注释&#xff1f;二. 什么是动态sql&#xff1f;三. 动态sql常用标签有…

pycharm 使用远程服务器 jupyter (本地jupyter同理)

1. 远程服务器miniconda 环境中创建jupyter环境 # 1. 激活环境 conda activate envname#2. 在环境中安装jupyter pip install jupyter # 或者 conda install jupyter#3. 生成jupyter_notebook_config.py文件 jupyter notebook --generate-config#4. 设置密码 jupyter noteboo…

Spark编程-SparkSQL

SparkSql能做些啥 Spark SQL的核心概念是DataFrame&#xff0c;它是一个分布式的数据集合&#xff0c;类似于关系数据库中的表。支持使用SQL语言直接对DataFrame进行查询,提供了丰富的内置函数和表达式&#xff0c;可以用于数据的转换、过滤和聚合等操作,支持多种数据源&#…

功能测试也可以发现数据库相关的性能问题

很多同学认为功能测试和性能测试是严格分开的&#xff0c;功能测试人员无法发现性能问题。其实不是这样的&#xff0c;功能测试人员在验证功能时也可以发现性能问题&#xff1b;一些功能反而在功能测试环境不好验证&#xff0c;需要在性能环境上测试。 今天咱们就说一下测试涉及…

Leetcode 滑动窗口题目总结

(Leetcode 滑动窗口题目总结) 1&#xff1a; 3.无重复字符的最长子串 https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/子串 和 子序列的区别&#xff1a;字串是连续的&#xff0c;子序列是非连续的。快慢指针 i 和 j&#xff0c;…

前端面试题 —— React (二)

目录 一、React 组件中怎么做事件代理&#xff1f;它的原理是什么&#xff1f; 二、React.Component 和 React.PureComponent 的区别 三、Component, Element, Instance 之间有什么区别和联系&#xff1f; 四、React声明组件有哪几种方法&#xff0c;有什么不同&#xff1f…

QT项目代码去UI界面常用开发步骤

QT项目代码去UI界面常用开发步骤 因项目开发需求&#xff0c;领导要求整个QT项目中不要用UI方式来实现界面&#xff0c;这样能保障程序运行稳定性以及代码的逻辑和可读性,先记录具体操作步骤如下&#xff1a; 1、首先我们通过拖控件的方式来实现界面的设计效果&#xff0c…