【MySQL基本功系列】第二篇 InnoDB存储引擎的架构设计

news2024/12/25 7:55:40

通过上一篇文章,我们简要了解了MySQL的运行逻辑,从用户请求到最终将数据写入磁盘的整个过程。当数据写入磁盘时,存储引擎扮演着关键的角色,它负责实际的数据存储和检索。在MySQL中,有多个存储引擎可供选择,每个存储引擎都具有不同的特性和适用场景,但目前最常用的存储引擎之一是InnoDB。今天,我们将了解InnoDB存储引擎的架构设计和核心特点。

InnoDB存储引擎几大特性:

缓冲池(Buffer Pool)

缓冲池是InnoDB内部的一个重要内存结构,用于高效管理数据库表的数据和索引的缓存。

它在内存中存储了常用的数据页,以加速数据的读取和写入。

例如,我们要更新一条sql

UPDATE users set name='张老三' WHERE id = 1

这个时候,它会先找 id = 1 这行数据是否在缓冲池中,如果不在,就将这条数据从磁盘加载到缓存池中。
缓冲池

undo log

执行这个更新语句的话,就需要考虑如果这次更新是在一个事务里,事务提交成功之前可能会对数据进行回滚。

为了方便回滚,写入新的数据到内存(缓冲池之前),会把更新之前的数据,也就是说原来的数据写入undo log文件。

当我们把要更新的那行记录从磁盘文件加载到缓冲池,同时把更新前的旧值写入undo日志文件之后,就可以正式开始更新这行记录了。
在这里插入图片描述

Rodo Log

现在已经把内存里(缓冲池)的数据进行了修改,但是磁盘上的数据还没修改。

如果这时候MySQL机器宕机了,导致内存里修改过的数据丢失,应该怎么办呢?

为了防止这种情况发生,InnoDB 存储引擎在处理事务时采用了一种称为"write-ahead logging" (WAL) 的机制。

这意味着在更新 Buffer Pool(缓冲池,用于缓存数据页)时,会同时更新 Redo Log(重做日志)。

这是为了确保事务的持久性和一致性。

根据前面所讲,这时候Rodo Log的信息还存在内存中,当提交事务的时候,InnoDB会把Rodo Log中的内容写入到磁盘,目的是防止提交事务之后,发生意外宕机导致已提交事务的数据发生丢失。
在这里插入图片描述

把Rodo Log从内存写入磁盘由innodb_flush_log_at_trx_commit 参数进行控制:

1. innodb_flush_log_at_trx_commit = 0

每个事务提交时,并不会立即将事务日志刷新到磁盘,而是每秒执行一次日志刷新操作。
也就是说,提交事务之后,mysql宕机,那么此时redo日志没有刷盘,导致内存(MySQL内存)里的redo日志丢失,我们提交的事务更新的数据就丢失了。
可能会丢失最多一秒钟的事务。

2. innodb_flush_log_at_trx_commit = 1(默认值):

每次事务提交时,都会将事务日志立即刷新到磁盘。
这种配置提供了 最高的事务持久性 ,因为在事务提交后,日志已经被写入磁盘,即使系统崩溃,也能够最小程度地丢失数据。

3. innodb_flush_log_at_trx_commit = 2

每次事务提交时,事务日志会被写入到操作系统的缓存,而不是直接刷新到磁盘。
然后,日志会被每秒钟刷新到磁盘。这样可以提高性能,同时在机器崩溃时可能会丢失最多一秒钟的事务。

所以对于数据库这样严格的系统而言,一般建议redo日志刷盘策略设置为1,保证事务提交之后,数据绝对不能丢失。

当然,我们应该根据业务需要适当调整配置。


最后,我们来总结一下上述步骤:

检查缓冲池中是否存在数据:

首先,InnoDB 将检查缓冲池中是否已经存在需要更新的数据页。缓冲池是一个内存区域,用于存储数据库表的数据页,以提高读取和写入性能。

从磁盘读取数据页到缓冲池:

如果数据页不在缓冲池中,InnoDB 将从磁盘读取相应的数据页到缓冲池中。这是因为在更新操作之前,数据通常首先被读取到内存中进行修改。

更新 Undo Log:

在更新数据之前,InnoDB 会先将修改前的数据记录到 Undo Log 中。这是为了提供事务的回滚能力,在需要时可以撤销已提交事务的更改。

更新 Redo Log 和缓冲池中的数据:

数据页在缓冲池中被更新,同时相应的修改操作也会被记录到 Redo Log 中。这是为了确保即使在事务提交后,对数据的修改也能够在崩溃恢复时重新应用,维护数据的一致性。
数据在缓冲池中的修改是在内存中进行的,这样可以提高写入性能。而 Redo Log 的更新是在事务提交时进行的,确保已提交的事务更改被持久化。

提交事务:

当事务完成所有的更新操作,并且事务成功提交时,相关的修改将最终写入磁盘的数据文件,从而实现了事务的持久性。

更新 Redo Log 到磁盘:

在事务提交后,Redo Log 的最新内容也会被定期刷新到磁盘。这确保了即使在系统崩溃时,已提交的事务更改也能够被重新应用,维护数据的一致性。

综上所述,InnoDB 处理更新请求的过程包括检查和读取数据页,更新 Undo Log,修改缓冲池中的数据,记录 Redo Log,提交事务,并最终将 Redo Log 刷新到磁盘。这个过程保证了数据的一致性、持久性,同时通过事务日志的机制提供了崩溃恢复的支持。

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

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

相关文章

51单片机PCF8591数字电压表LCD1602液晶显示设计( proteus仿真+程序+设计报告+讲解视频)

51单片机PCF8591数字电压表LCD1602液晶设计 ( proteus仿真程序设计报告讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0060 51单片机PCF8591数字电压表LCD1602液晶设计 1.主要功能&a…

Python高级语法----Python装饰器的艺术

文章目录 装饰器基础示例代码:执行结果:参数化装饰器示例代码:执行结果:类装饰器示例代码:执行结果:装饰器的堆栈示例代码:执行结果:在Python中,装饰器是一种非常强大的特性,允许开发人员以一种干净、可读性强的方式修改或增强函数和方法。以下是一个关于Python装饰器…

如何使用安卓手机数据恢复软件从安卓手机恢复数据

在 Android 上丢失数据并不是世界末日。拿起您的设备,利用最好的 Android 数据恢复软件来恢复手机内存或 SD 卡中的文件、通话记录、消息、联系人、照片、视频等。 在使用 Android 手机的过程中,您会体会到数字存储的便利性,它可以保存大量数…

elemenui的Upload上传整合成数组对象

1. 普通直接上传 <el-upload action"" :before-upload"doBeforeUpload"><el-button type"success" size"mini">导入</el-button></el-upload> methods:{doBeforeUpload(file) {let reader new FileReader(…

简单得令人尴尬的FSQ:“四舍五入”超越了VQ-VAE

©PaperWeekly 原创 作者 | 苏剑林 单位 | 月之暗面 研究方向 | NLP、神经网络 正如 “XXX is all you need” 一样&#xff0c;有不少论文都以“简单得令人尴尬”命名&#xff08;An Embarrassingly Simple XXX&#xff09;&#xff0c;但在笔者看来&#xff0c;这些论文…

8种很坑的SQL错误用法

1、LIMIT 语句 分页查询是最常见的场景之一&#xff0c;但也通常也是最容易出问题的地方。例如对于下面简单的语句&#xff0c;一般 DBA 想到的办法是在 type, name, create_time 字段上加组合索引。这样条件排序都能有效的利用到索引&#xff0c;性能迅速提升。 好吧&#xf…

docker 拉取镜像

2.2.1、拉取镜像java:8(jdk1.8) docker pull java:8 2.2.2、拉取镜像mysql:8.2.0 docker pull mysql:8.2.0 2.2.3、拉取镜像redis:7.0.14 docker pull redis:7.0.14 2.2.4、拉取镜像nginx:1.25.3 docker pull nginx:1.25.3 2.2.5、查看镜像 docker images 启动镜像 …

Vatee万腾的科技决策力奇迹:Vatee科技决策力的独特之选

在金融投资的复杂领域中&#xff0c;Vatee万腾以其独特的科技决策力创造了一场真正的奇迹。这不仅是一种引领投资者走向成功的选择&#xff0c;更是一种开启新时代的科技决策奇迹。 Vatee的科技决策力背后蕴藏着强大的智慧和创新。通过大数据分析、智能算法的运用&#xff0c;V…

华为防火墙二层透明模式下双机热备主备备份配置(两端为交换机)

这种模式只能是主备备份模式&#xff0c;不能是负载分担&#xff0c;因为会有环路。 故障切换是&#xff0c;如果主故障&#xff0c;主设备所有接口全都会down状态&#xff0c;然后再up一次&#xff0c;用于改变mac转发表。 FW1 hrp enable hrp interface GigabitEthernet1/0…

【赠书活动】嵌入式虚拟化技术与应用

文章目录 前言 1 背景概述 2 专家推荐 3 本书适合谁&#xff1f; 4 内容简介 5 书籍目录 6 权威作者团队 7 粉丝福利 前言 随着物联网设备急剧增长和万物互联应用迅速发展&#xff0c;虚拟化技术成为嵌入式系统焦点。这反映了信息技术迫切需求更高效、灵活和可靠系统。…

Excel 常用技巧

1: 拼接 公式: C1&B1&A1 如 D CBA 将公式输入目标列之后回车即可得到结果 , 如果有多行需要处理 , 光标选中目标单元格右下角变为 按着左键下拉即可 最后选择转换功能转换为文本即可 2: 时间戳转时间格式 公式: TEXT((B2/10008*3600)/8640070*36519,"yyyy/mm…

100V耐压内置MOS ESOP8 40V输入转5V 2.1A恒压输出

100V耐压内置MOS ESOP8 40V输入转5V 2.1A恒压输出 SC9102 是一款宽电压范围降压型 DC-DC 电源管理芯片&#xff0c;内部集成使能开关控制、基准电源、误差放大器、 过热保护、限流保护、短路保护等功能&#xff0c;非常适合宽电压输入降压使用。 SC9102 零功耗使能控制&…

Transmit :macOS 好用的 Ftp/SFtp 工具

Transmit 是一种功能强大的 FTP/SFTP/WebDAV 客户端软件&#xff0c;是一个 Mac OS X 平台上设计的文件传输软件。它由 Panic&#xff08;一家以软件工具为主的公司&#xff09;开发和维护&#xff0c;是一款非常受欢迎且易于使用的软件&#xff0c;而且被广泛认为是 Mac OS X …

【C++】哈希 Hash(闭散列、开散列介绍及其实现)

一、unordered系列关联式容器 在 C98 中&#xff0c;STL 提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到 O(logN)&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好的查询是&…

ChatGPT显现“ Something went wrong. If this issue persists ...”什么原因?如何解决?

一、报错提示 Something went wrong. If this issue persists please contact us through our help center at help.openai.com. 二、解决方案 一般是代理节点出现问题 ChatGPT退出登录 关闭代理并重新启动代理 切换其他节点 清除浏览器缓存 重新登录ChatGPT 三、其它思路…

模电学习路径--google镜像chatgpt

交流通路实质 列出电路方程1&#xff0c;方程1对时刻t做微分 所得方程1‘ 即为 交流通路 方程1对时刻t做微分&#xff1a;两个不同时刻的方程1相减&#xff0c;并 令两时刻差为 无穷小 微分 改成 差 模电学习路径&#xff1a; 理论 《电路原理》清华大学 于歆杰 朱桂萍 陆文…

使用大型语言模型进行文本摘要

路易斯费尔南多托雷斯 &#x1f4dd; Text Summarization with Large Language Models。通过单击链接&#xff0c;您将能够逐步阅读完整的过程&#xff0c;并与图进行交互。谢谢你&#xff01; 一、介绍 2022 年 11 月 30 日&#xff0c;标志着机器学习历史上的重要篇章。就在这…

jacoco插桩源码,看这一篇就够了

知识储备 众所周知&#xff0c;jacoco的功能主要分成两块&#xff1a; jacoco agentjacoco cli 其中jacoco agent主要用来对业务方服务进行插装&#xff0c;而cli则提供一些工具对插桩数据进行处理&#xff0c;比如dump&#xff0c;merge,report等&#xff0c;今天我们着重通…

周期定时器FB_Cycle_time(SCL+梯形图代码)

博途PLC定时器指令使用详细介绍请参考下面文章链接: 博途PLC IEC定时器编程应用(SCL语言)_scl定时器-CSDN博客文章浏览阅读6.1k次,点赞2次,收藏7次。博途PLC定时器支持数据类型TIME 类型 ,写法支持T#2M10S 、T#10S等,时基是MS所以如果设置1M用 DINT数据类型就是60000,…

力扣哈希表--总结篇

前言 五天写了八道题&#xff0c;有点懈怠&#xff0c;但还是有收获。 内容 一般哈希表都是用来快速判断一个元素是否出现在集合里。 为了实现高效的查找和访问&#xff0c;map通常会使用哈希表或红黑树等数据结构来存储键值对。什么时候用map&#xff0c;什么时候用数组&a…