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

通过上一篇文章,我们简要了解了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 刷新到磁盘。这个过程保证了数据的一致性、持久性,同时通过事务日志的机制提供了崩溃恢复的支持。

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

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

相关文章

HCIA-DHCP+DHCP中继

DHCPDHCP中继 实验拓扑配置步骤第一步 配置Eth-Trunk聚合链路&二层VLAN第二步 配置IP地址第三步 配置DHCPDHCP中继 配置验证查看PC1 PC2是否正确的获得了IP地址 实验拓扑 配置步骤 第一步 配置Eth-Trunk聚合链路&二层VLAN SW1 sysname SW1 # undo info-center enabl…

Linux 内核启动流程

目录 链接脚本vmlinux.ldsLinux 内核启动流程分析Linux 内核入口stext__mmap_switched 函数start_kernel 函数rest_init 函数init 进程 看完Linux 内核的顶层Makefile 以后再来看Linux 内核的大致启动流程,Linux 内核的启动流程要比uboot 复杂的多,涉及到…

SparkAi创作系统ChatGPT网站源码+详细搭建部署教程+AI绘画系统+支持GPT4.0+Midjourney绘画

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

VulnHub Nullbyte

一、信息收集 1.nmap扫描 arp-scan -l扫描内网存活主机 ┌──(root💀kali)-[~/桌面] └─# nmap -sS -A -p- 192.168.103.201/24 -sS 半扫描 -A 扫描详细信息 -p- 扫描全端口发现开放了80、111、777、50978端口 且发现777端口开放了ssh服务,说明他把…

深度学习之各种配置环境

如何使用python进行深度学习,我们需要配置相应的环境 第一步:先安装python python的官网地址:https://www.python.org/ 点进去,点击 Downloads,然后点击 Windows 等待下载完成,安装步骤请参考下文&#x…

主题模型LDA教程:一致性得分coherence score方法对比(umass、c_v、uci)

文章目录 主题建模潜在迪利克雷分配(LDA)一致性得分 coherence score1. CV 一致性得分2. UMass 一致性得分3. UCI 一致性得分4. Word2vec 一致性得分5. 选择最佳一致性得分 主题建模 主题建模是一种机器学习和自然语言处理技术,用于确定文档…

Linux程序的地址空间

Linux程序的地址空间 📟作者主页:慢热的陕西人 🌴专栏链接:Linux 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容深刻理解了什么程序或者进程的地址…

【性能测试】非GUI模式Jemter压测+TPS性能拐点详细,一篇带你打通...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 非GUI模式执行Jem…

YOLOv8 Ultralytics:使用Ultralytics框架训练RT-DETR实时目标检测模型

YOLOv8 Ultralytics:使用Ultralytics框架训练RT-DETR实时目标检测模型 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows 制作自己的数据集训练自己的数据集创建自己数据集的yaml文件football.yaml文件内容 进行训练进行验证进行预测 数据集获取参考文献 …

python 对全局变量的修改,需要使用global关键字

is_debug Falsedef get_is_debug():return is_debugdef set_is_debug(dbg):global is_debugis_debug dbg代码review的时候有个同事(我们主要都是开发c代码的,python也会写,但是用的少)说,set_is_debug函数中 is_debu…

Leetcode-94 二叉树的中序遍历

递归实现 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

网络安全基础之php开发文件下载的实现

前言 php是网络安全学习里必不可少的一环,简单理解php的开发环节能更好的帮助我们去学习php以及其他语言的web漏洞原理 正文 在正常的开发中,文件下载的功能是必不可少,比如我们在论坛看到好看图片好听的歌时,将其下载下来时就…

蓝桥杯算法竞赛第一周题型总结

本专栏内容为:蓝桥杯学习专栏,用于记录蓝桥杯的学习经验分享与总结。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库🚚 🌹&#x1f33…

为什么单片机内不继承晶振

一、晶振是什么?有什么作用? 晶振(Crystal Oscillator)是一种基于晶体材料的振荡器,用于提供稳定的振荡信号。晶体是一种可通过机械振动在电场作用下产生相应电压的物质。晶振由晶体与电路共同组成,晶体负责…

KT6368A蓝牙芯片的距离天线周围的匹配元器件LC,能增加距离吗

一、简介 KT6368A蓝牙芯片的距离,以及天线周围的元器件,电感和电容,添加上去是否可以增加距离? 详细描述 关于蓝牙芯片的rf性能,也就是距离,其实中规中矩吧,但是达到20米还很简单的&#xff…

2023年10 种用于最佳稳定扩散最佳方案

在过去的一年里,您可能已经看到了很多关于 ChatGPT 和其他 AI 自动纹理的新闻。但是,页面(或屏幕)上的文字远非现代组织和设计师使用人工智能的唯一方式。Stable Diffusion 等工具可帮助您创建令人惊叹的 AI 图像,供个…

【CodeTop】TOP 100 刷题 1-10

文章目录 1. 无重复字符的最长子串题目描述代码与思路 2. 反转链表题目描述代码与解题思路 3. LRU 缓存题目描述代码与解题思路 4. 数组中的第K个最大元素题目描述代码与解题思路 5. K 个一组翻转链表题目描述代码与解题思路 6. 三数之和题目描述代码与解题思路 7. 最大子数组和…

稳定扩散AI 纹理生成器

推荐基于稳定扩散(stable diffusion) AI 模型开发的自动纹理工具: DreamTexture.js自动纹理化开发包 - NSDT 什么是稳定扩散? 从技术上讲,Stable Diffusion 是一种用于机器学习的潜在扩散模型 (LDM)。这种类型的专用深…

2023-11笔记

1.switch空指针异常 Exception in thread "main" java.lang.NullPointerException:Cannot invoke "String.hashCode()" because "<local2>" is nullat Study5.Test03.main(Test03.java:6)我们由此可以知道&#xff0c;switch语句部分情况下…

@ConfigurationProperties使用

一直有个疑问,在使用ConfigurationProperties注解作用一个配置类时,如果该配置类继承了一个父类,那么父类的那些配置字段是否可以读取配置信息。 答案是可以的&#xff0c;前提是父类对应字段的set方法是public。 BaseProperties.java Getter Setter public class BasePropert…