【MySQL进阶】InnoDB引擎存储结构和架构

文章目录

  • 逻辑存储结构
  • 架构
    • 内存结构
      • Buffer Pool&Adaptive Hash Index
      • Change Buffer
      • Log Buffer
    • 磁盘结构

逻辑存储结构

image.png

  1. 表空间(Tablespaces):InnoDB使用表空间来管理存储表和索引的数据文件。每个表空间包含一个或多个数据文件,这些文件实际上存储数据表和索引。
  2. 段(Segments):InnoDB将每个表空间划分为多个段,用于存储不同类型的数据。主要的段类型包括数据段、索引段、回滚段和系统段。数据段就是B+树的叶子节点, 索引段即为B+树的 非叶子节点。
  3. 区(Extent):每个段由一组区组成,每个区的大小通常为1MB。区是InnoDB中进行磁盘读写的最小单元,它包含了一组连续的数据页。
  4. 页(Page):区又由一组页组成,通常为16KB大小。页是InnoDB存储数据的最小单位,它可以包含表的行数据、索引数据以及其他管理信息。
  5. 行(Row):InnoDB使用"B+树"索引结构来组织数据。数据行存储在表的叶子页中,每一行代表一条记录。行数据包括所有列的值以及一些额外的管理信息。
  • x_id:每次对某条记录进行改动时,都会把对应的事务id赋值给trx_id隐藏列。
  • Roll_pointer:每次对某条引记录进行改动时,都会把旧的版本写入到undo日志中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息。
  1. 索引(Index):InnoDB使用聚集索引的方式来存储数据。每个InnoDB表都有一个主键索引,它决定了数据的物理存储顺序,并且作为其他非主键索引的查找入口。除了主键索引外,InnoDB还支持创建其他非主键索引,这些索引通常会占用额外的存储空间。

架构

MySQL5.5 版本开始,默认使用InnoDB存储引擎,它擅长事务处理,具有崩溃恢复特性,在日常开发
中使用非常广泛。下面是InnoDB架构图,左侧为内存结构,右侧为磁盘结构
image.png

内存结构

我们先来看看内存结构
image.png
主要分为这么四大块儿: Buffer Pool、Change Buffer、Adaptive Hash Index、Log Buffer。

Buffer Pool&Adaptive Hash Index

Buffer Pool 本质上是 InnoDB 向操作系统申请的一段连续的内存空间。InnoDB 的数据是按数据页为单位来读写,每个数据页的大小默认是 16KB。数据是存放在磁盘中,每次读写数据都需要进行磁盘 IO 将数据读入内存进行操作,效率会很低,所以提供了 Buffer Pool 来暂存这些数据页,缓存中的这些页又叫缓冲页。缓冲页的数据会以一定的频率刷新到磁盘中,减少了IO。

工作原理:

  • 从数据库读取数据时,会首先从缓存中读取,如果缓存中没有,则从磁盘读取后放入 Buffer Pool
  • 向数据库写入数据时,会写入缓存,缓存中修改的数据会定期刷新到磁盘,这一过程称为刷脏

Buffer Pool 以Page页为单位,每个缓冲页都有对应的控制信息,包括表空间编号、页号、偏移量、链表信息等,控制信息存放在占用的内存称为控制块,控制块与缓冲页是一一对应的,但并不是物理上相连的,都在缓冲池中。底层采用链表数据结构管理Page。
根据状态,将Page分为三种类型:

  • free page:空闲page,未被使用。
  • clean page:被使用page,数据没有被修改过。
  • dirty page:脏页,被使用page,数据被修改过,也中数据与磁盘的数据产生了不一致。

MySQL 提供了缓冲页的快速查找方式:哈希表,使用表空间号和页号作为 Key,缓冲页控制块的地址作为 Value 创建一个哈希表,获取数据页时根据 Key 进行哈希寻址:

  • 如果不存在对应的缓存页,就从 free 链表中选一个空闲缓冲页,把磁盘中的对应页加载到该位置
  • 如果存在对应的缓存页,直接获取使用,提高查询数据的效率

Change Buffer

InnoDB 管理的 Buffer Pool 中有一块内存叫 Change Buffer 用来对增删改操作提供缓存,可以通过参数来动态设置,设置为 50 时表示 Change Buffer 的大小最多占用 Buffer Pool 的 50%

  • 唯一索引的更新不能使用 Change Buffer,需要将数据页读入内存,判断没有冲突在写入
  • 普通索引可以使用 Change Buffer,直接写入 Buffer 就结束,不用校验唯一性

Change Buffer 并不是数据页,只是对操作的缓存,所以需要将 Change Buffer 中的操作应用到旧数据页,得到新的数据页(脏页)的过程称为 Merge

  • 触发时机:访问数据页时会触发 Merge、后台有定时线程进行 Merge、在数据库正常关闭(shutdown)的过程中也会触发
  • 工作流程:首先从磁盘读入数据页到内存(因为 Buffer Pool 中不一定存在对应的数据页),从 Change Buffer 中找到对应的操作应用到数据页,得到新的数据页即为脏页,然后写入 redo log,等待刷脏即可

说明:Change Buffer 中的记录,在事务提交时也会写入 redo log,所以是可以保证不丢失的
业务场景:

  • 对于写多读少的业务来说,页面在写完以后马上被访问到的概率比较小,此时 Change Buffer 的使用效果最好,常见的就是账单类、日志类的系统
  • 一个业务的更新模式是写入后马上做查询,那么即使满足了条件,将更新先记录在 Change Buffer,但之后由于马上要访问这个数据页,会立即触发 Merge 过程,这样随机访问 IO 的次数不会减少,并且增加了 Change Buffer 的维护代价

补充:Change Buffer 的前身是 Insert Buffer,只能对 Insert 操作优化,后来增加了 Update/Delete 的支持,改为 Change Buffer。
下面是 InnoDB 存储引擎中修改数据的工作流程:

  1. 写操作:当有一个写操作需要修改某个非唯一索引时,例如插入、更新或删除操作,InnoDB 将首先将这个修改操作记录在 Change Buffer 中。
  2. Buffer Pool 中的修改:同时,InnoDB 会将被修改的数据页(包括索引页和数据页)加载到 Buffer Pool 中进行修改。在 Buffer Pool 中进行修改操作可以获得更快的访问速度和更低的 I/O 开销。
  3. 脏页标记:当数据页在 Buffer Pool 中被修改后,会被标记为 “dirty”,表示该页已被修改,需要在未来的某个时间点写回到磁盘。
  4. 脏页刷入:InnoDB 会异步进行脏页的刷入操作。这个过程称为 “flush”,通常由后台线程或异步刷新操作来完成。在刷入过程中,脏页的修改将被写回到磁盘上的对应数据文件中。
  5. 读操作:当其他查询或读取需要访问被修改的记录时,InnoDB 首先检查 Buffer Pool 中是否存在所需数据页。如果存在,数据将直接从 Buffer Pool 中获取。如果数据不在 Buffer Pool 中,则需要从磁盘读取对应的数据页到 Buffer Pool 中,然后再返回结果。

Log Buffer

Log Buffer:日志缓冲区,用来保存要写入到磁盘中的log日志数据(redo log 、undo log),
默认大小为 16MB,日志缓冲区的日志会定期刷新到磁盘中。如果需要更新、插入或删除许多行的事
务,增加日志缓冲区的大小可以节省磁盘 I/O。
参数:
innodb_log_buffer_size:缓冲区大小
innodb_flush_log_at_trx_commit:日志刷新到磁盘时机,取值主要包含以下三个:

  • 1: 日志在每次事务提交时写入并刷新到磁盘,默认值。
  • 0: 每秒将日志写入并刷新到磁盘一次。
  • 2: 日志在每次事务提交后写入,并每秒刷新到磁盘一次。

磁盘结构

在这里插入图片描述

  1. System Tablespace(系统表空间): 系统表空间是数据库管理系统(DBMS)中的一个重要组件。它包含了系统表、用户表的元数据以及其他系统级数据。系统表空间通常以文件的形式存在,例如在MySQL中,系统表空间通常是由一个或多个.ibd或.frm文件组成。系统表空间对于数据库的正常运行至关重要。

  2. File-Per-Table Tablespaces(独立表空间): 在一些数据库系统(如MySQL的InnoDB存储引擎)中,可以配置为每个表使用独立的表空间文件。这种配置方式称为"File-Per-Table"。每个表拥有自己的表空间文件,包括数据和索引。这种设计使得表的备份和恢复更加方便,并提供更好的性能和扩展性,同时减少数据碎片化的问题。

  3. General Tablespaces(通用表空间): 通用表空间是MySQL 5.7版本中引入的特性。通用表空间允许将多个表存储在一个或多个共享表空间文件中。这种方式便于管理和维护数据库对象,可以更灵活地进行数据迁移和备份。

  4. Undo Tablespaces(撤消表空间): 撤消表空间用于存储事务的撤消日志,也被称为回滚日志。在数据库中,事务修改数据时,撤消日志记录了对数据所做的修改,以便在回滚操作或崩溃恢复时撤销或恢复事务。

  5. Temporary Tablespaces(临时表空间): 临时表空间用于存储临时表、排序和哈希操作等过程中的临时数据。这些临时数据在操作完成后会自动清除,临时表空间通常具有较高的性能要求。

  6. Doublewrite Buffer Files(双写缓冲): 双写缓冲是InnoDB存储引擎中的一项机制,用于提高数据的写入可靠性。当InnoDB执行写入操作时,会先将数据写入双写缓冲区(一个内存缓冲区),然后再异步地将数据写入磁盘,以保证数据的一致性和可靠性。

  7. Redo Log(重做日志): 重做日志是数据库管理系统中的一种日志机制,用于记录已经发生的事务操作。在数据库发生故障或崩溃时,通过重做日志可以将未提交的事务重新应用到数据库,恢复到故障发生前的状态。重做日志通常以文件的形式存在,是数据库持久性和可恢复性的重要保障。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【学网攻】 第(9)节 -- 路由器使用以及原理

系列文章目录 目录 系列文章目录 文章目录 前言 一、路由器是什么? 二、实验 1.引入 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan…

解锁一些SQL注入的姿势

昨天课堂上布置了要去看一些sql注入的案例,以下是我的心得: ​​​​​​​ ​​​​​​​ ​​​​​​​ 1.新方法 打了sqli的前十关,我发现一般都是联合查询,但是有没有不是联合查询的方法呢&#xf…

Python基础学习 -05 基本类型

Python3 基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。 等号&…

Nodejs前端学习Day1_补档

我给day1搞没了,还是觉得该补一个,有用 文章目录 前言一、学习目标二、学习目录三、为什么JavaScript代码可以在浏览器中运行四、为什么JavaScript可以操作DOM和BOM五、浏览器中的JavaScript运行环境总结 前言 补档 一、学习目标 二、学习目录 三、为什…

苹果备忘录删除了怎么恢复?看这,5分钟学会4种方法

在日常使用中,我们有时会不小心删除苹果备忘录中的重要内容。这些内容可能是重要的提醒、重要的日程安排,也可能是珍贵的回忆。一旦删除,可能会对我们的生活和工作带来很大的困扰。那么,苹果备忘录删除了怎么恢复呢?本…

小屏幕大作用 电子墨水屏桌牌、门牌—构建绿色办公环境新途径

在当今信息化社会,电子设备已经深入到我们生活的方方面面。其中,电子墨水屏作为一种特殊的显示技术,因其低功耗、护眼、节能环保等特点,受到了广泛欢迎。本文将探讨电子墨水屏在构建绿色办公环境中的重要作用,特别是电…

上位机图像处理和嵌入式模块部署(python opencv)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们谈到了qt,谈到了opencv,也谈到了嵌入式,但是没有说明python在这个过程当中应该扮演什么样的角色。open…

无线测温在线监测系统工作原理与产品选型

摘要:本文首先介绍了无线测温在线监测系统的基本工作原理以及软硬件组成,重点介绍了在线监测的无线测温技术特点。在此研究基础上,探讨了无线测温在线监测系统在实际工作场景中的应用案例,证明了其在温度检测方面的重要应用价值。…

FlashInternImage实战:使用FlashInternImage实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构编译安装DCNv4环境安装过程配置CUDAHOME解决权限不够的问题 按装ninja编译DCNv4 计算mean和std生成数据集 摘要 https://arxiv.org/pdf/2401.06197.pdf 论文介绍了Deformable Convolution v4(DCNv4&…

#include<iomanip>前不可以加#define int long long

加了会报许多奇怪的错 但是放后面就可以了 尽量不要在头文件前宏定义原始类型

防御保护---安全策略

文章目录 目录 一.安全策略概述 概述: 安全策略的作用: 安全策略与传统防火墙的区别 二.案例分析 练习 一.安全策略概述 概述: 防火墙安全策略的作用在于加强网络系统的安全性,保护网络免受恶意攻击、非法访问和数据泄露的威胁。…

分享一个可以免费下载高清图片和视频的网站

据说很多才华横溢的摄影作者在这里免费分享最精彩的素材图片和视频。 完全开放免费 来看其中的一些图片: 多的就不发了,视频素材也有!都是一些顶尖摄影师上传的作品 这个宝藏网站是,现有需要的小伙伴可以收藏起来 https://www…

【广度优先搜索】【拓扑排序】【C++算法】913. 猫和老鼠

作者推荐 【动态规划】【map】【C算法】1289. 下降路径最小和 II 本文涉及知识点 广度优先搜索 拓扑排序 逆推 LeetCode913. 猫和老鼠 两位玩家分别扮演猫和老鼠,在一张 无向 图上进行游戏,两人轮流行动。 图的形式是:graph[a] 是一个列…

python-分享篇-使用海龟turtle模块实现幸福大转盘

文章目录 准备代码效果 准备 一、根目录下放图片 代码 from turtle import * import turtle from random import randint import sys #屏幕初始化 screen turtle.Screen() screen.title("幸运大转盘 转转转~") screen.setup(480,450) screen.bgpic("转盘.png…

基于机器学习的地震预测(Earthquake Prediction with Machine Learning)

基于机器学习的地震预测(Earthquake Prediction with Machine Learning) 一、地震是什么二、数据组三、使用的工具和库四、预测要求五、机器学习进行地震检测的步骤六、总结 一、地震是什么 地震几乎是每个人都听说过或经历过的事情。地震基本上是一种自…

Android源码设计模式解析与实战第2版笔记(五)

第七章 时势造英雄 – 策略模式 策略模式的定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。 策略模式的使用场景 针对同一类型问题的多种处理方式,仅仅…

YOLOv8优化策略:轻量化改进 | RepGhost,通过重参数化实现硬件高效的Ghost模块

🚀🚀🚀本文改进:RepGhost,通过重参数化实现硬件高效的Ghost模块,性能优于GhostNet、MobileNetV3等,在移动设备上具有更少的参数和可比的延迟。 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1.原…

污水处理行业:环保远程控制网关S275引领行业变革

近年来,随着城镇工业的不断发展,污水处理厂在城市中扮演着重要角色。作为国家新兴战略产业之一的水处理行业也是蓬勃发展。如何节省成本、保证水质的稳定性和安全性,从而达到节能、减排、节水的目的是工厂考虑的重中之重。 案例 客户是一家…

雨云美国二区云服务器评测

雨云美国二区云服务器评测 官网直接百度搜索雨云就行 我买的时候比较便宜,三个月3.4元,1C1G对于我这种小网站来说够用了 本期测评服务器配置 CPU:1核 内存:1G 硬盘:Linux系统20G,win系统30G 流量&…

【数据结构与算法】之字符串系列-20240127

这里写目录标题 一、面试题 08.07. 无重复字符串的排列组合二、面试题 10.02. 变位词组三、面试题 17.11. 单词距离四、LCR 014. 字符串的排列五、LCR 020. 回文子串六、1528. 重新排列字符串 一、面试题 08.07. 无重复字符串的排列组合 中等 无重复字符串的排列组合。编写一种…
最新文章