MySQL学习笔记7【InnoDB】

Innodb

1. 架构

1.1 内存部分

buffer pool

缓冲池是主存中的第一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删查改操作时,先操作缓冲池中的数据,然后以一定频率刷新到磁盘,这样操作明显提升了速度。

缓冲池以page为单位,底层采取链表的数据结构管理page,这一点和xv6是一模一样的,根据状态,分为三类:

  • 空闲页free page
  • 干净页clean page,分配之后没有被修改过
  • 脏页dirty page,数据被修改过,与磁盘中的数据不一致
change buffer

更改缓冲区,字面意思,主要针对于二级索引页,当我们在buffer pool执行数据变更操作(DML)的时候,如果没有找到这个数据,并不会直接读取磁盘数据,而是将其写入到change buffer,等未来读取数据的时候,直接将数据合并,恢复到buffer pool中,再将数据刷新到磁盘中,由于二级索引页插入删除相对随机,所以如果每次写入都会进行磁盘IO的话,性能太差,而使用change buffer,就减少了磁盘IO,提高了读写效率。

自适应哈希

自适应哈希索引,我们的InnoDB引擎默认是B+树索引,相对于哈希表慢一点,但是哈希表不支持范围查询,所以InnoDB为了提高查询效率,为buffer pool添加了一个自适应哈希索引,我们的InnoDB引擎会自己监控各个索引页上的索引,如果观察到hash索引可以提升查询速度,就会建立哈希索引,这个过程无需人工干预,但是我们需要知道这个参数是adaptive_hash_index,默认开启。

log buffer

保存要写入到磁盘中的两份日志:redo log和undo log,默认大小16M,会定期刷新到磁盘,如果更新插入较频繁,增加缓冲区大小可以减少磁盘IO,参数:

  • innodb_log_buffer:缓冲区大小。
  • innodb_flush_log_trx_commit:刷新到磁盘的时机。
    • 1:每次事务提交写入
    • 0:每秒写入
    • 2:两者结合

1.2 磁盘部分

系统表空间

主要处理非主键非唯一的二级索引的更改缓冲区,也就是change buffer,当然,这个和内存中的change buffer不一样,它主要用来存储我们的在真正写入表空间的变更操作,为啥不直接写入表空间?,原因是这样可以进一步避免频繁的磁盘IO,我们缓存的是变更操作,而不是整页的数据,并且在磁盘上,可以缓存大量变更。

文件表空间

我们建立的每一张表都有一个独立的表空间,文件表空间都包含单个InnoDB表的结构,数据和索引,并且存储在文件系统的单个数据文件中,参数:innodb_file_per_table

通用表空间

如果我们没有自己去创建,是没有这个通用表空间的,需要通过CREATE TABLESPACE来创建,我们可以为表指定表空间

CREATE TABLE [name] (......
)TABLESPACE [spacename];

这样可以使得多个表共享一个ibd文件,避免ibd文件过多,当然,这些表依旧是独立的,我们可以将许多小型的表集中存储,可以减少磁盘碎片,简化管理,并且利于批量的备份恢复。

撤销表空间

在mysql实例初始化时会自动创建两个默认的undo表空间,初始大小16M,用于存储undo log日志,保证事务的原子性和一致性,主要用于支持事务的回滚操作。

临时表空间

用于存储用户创建的临时表,比如说多表查询时会创建一个临时表,我们在执行查询/排序/GROUP BY等等的复杂操作时,可能会产生一个临时表存储中间结果,而这个临时表就存储在临时表空间当中,查询结束后,就会自动清理。

双写缓冲区

InnoDB引擎将数据页从buffer pool刷新到磁盘前,先会将数据页写入到双写缓冲区文件,便于系统异常时恢复。

重做日志

redo log,用来实现事务的持久性,由重做日志缓冲区和重做日志文件两部分组成,前者位于内存,后者位于磁盘,当事务提交之后,会将所有修改信息都存到该日志中,用于在刷新脏页到磁盘发生错误时的数据恢复使用。

而我们的redo log是一个循环写的机制,这一点和redis的AOF很像。

1.3 后台线程

将内存中缓存池的数据在合适的时机刷新入磁盘中。

Master Thread

核心后台线程,负责调度其他线程,还负责将缓冲池中的数据异步刷新到磁盘中,保持数据一致性,包括脏页的刷新,合并插入缓存,undo页的回收等。

IO Thread

在innodb引擎中,采取了AIO,也就是异步非阻塞IO,极大地提高了数据库的性能,我们的IO Thread主要负责这些异步请求的回调。

  • Read Thread:读操作
  • Write Thread:写操作
  • Log Thread:将日志缓冲区刷新到磁盘
  • Insert Buffer Thread:将写缓冲区的数据刷新到磁盘
Purge Thread

回收事务已经提交的Undo Log,事务提交之后,之前记录的undo log不再使用,就用purge thread来回收

Page Cleaner Thread

协助Master Thread刷新脏页到磁盘的线程,减轻核心后台线程的压力。


2. 事务原理

2.1 事务

前文我们知道,事务是密不可分的集合,具有ACID的特性,原子性,一致性,隔离性,持久性。

其中,原子性,一致性和持久性是由我们的redo log和undo log支持实现的;而隔离性是由我们InnoDB的锁机制和MVCC(多版本并发控制)实现的。

2.2 redo log

重做日志,记录事务提交时的数据页的修改,用来实现持久性,由redo log buffer和redo log file两部分组成,前者内存,厚泽磁盘,事务提交之后,会把所有修改信息都存到该日志文件中,用于刷新脏页到磁盘,发生错误时进行数据恢复使用,大致流程如下:

  1. 客户端向mysql服务端发起update操作
  2. mysql查询buffer pool,发现没有我们需要更新的数据。
  3. 启动后台线程,从后台读取我们需要的信息,随后写入到缓冲区,此时就可以直接对缓冲区进行操作,并且会将增删改的数据写入到redo log buffer当中,此时磁盘和内存数据不一致,称之为脏页。
  4. 那么我们如果定期将内存的数据刷新到磁盘,此时出错了,如果没有redo log buffer,我们的事务已经提交,说明了无法得到数据持久性保证,但是我们有了redo log,我们的redo log buffer会直接将修改的数据刷新到磁盘中的redo log file,如果出错了,就会通过redo log file恢复数据,**为啥redo log buffer不直接刷新到真正的数据页?**因为我们真正的数据页刷新将会是随机的IO,而直接记录到日志上是顺序写,所以性能更高。
  5. 而我们的redo log日志是类似循环写的模式,每隔一段时间都会被清理。

2.3 undo log

undo log日志解决原子性问题,叫做回滚日志,记录数据被修改前的操作,它可以提供回滚和MVCC(多版本并发控制),undo log和redo log的记录物理日志不一样,他是逻辑日志,比如说我们insert一条信息,在undo log中就是delete的形式记录,当我们执行rollback,就可以读取到相应的内容进行回滚。

undo log在事务执行时产生,但是在事务提交时并不会立刻删除,因为这些日志还可能用于MVCC,并且undo log采取段的方式时机管理和记录,存在rollback段,内部包含1024个undo log。


3. MVCC(多版本并发控制)

3.1 当前读

读取的是记录最新版本的记录,会加锁保证其他并发事务不会修改,我们在事务隔离级别可重复读中使用事务,如果在进入事务之后,有数据被修改,那么我们读取到的数据并不是最新的,也就不是当前读,如果想要当前读,我们可以执行 SELECT ... LOCK IN SHARE MODE ,初次之外,还可以使用 SELECT FOR UPDATE/INSERT/DELETE 来实现当前读。

3.2 快照读

简单的selete就是我们的快照读,比如我们在可重复读的事务隔离级别中,就是典型的快照读,不加锁,是非阻塞读,当然,在我们的串行化的事务隔离级别中,快照读就会退化为当前读,在read committed中,每次select都会生成一个快照读。

3.3 MVCC

多版本并发控制,它会维护一个数据的多个版本,使得读写操作没有冲突,快照读为mysql实现mvcc提供了一个重要的非阻塞读功能,当,MVCC还依赖于数据库记录的三个隐式字段,undo log, readview。

隐式字段

当我们创建表的时候,会指定相应的表结构,包括id,name,age的字段,我们可以显式的看到这些字段,但是实际上,mysql还未我们隐藏了三个额外增加的字段:

DB_TRX_ID:最近修改事务ID,记录最后插入或修改这一行的事务ID。

DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本,配合undo log。

DB_ROW_ID:隐藏主键,如果表结构没有主键,就会生成这个隐藏字段。

undo log

我们之前提过,undo log在一定情况下不会被立即删除,比如update和delete,产生的undo log不仅在回滚时需要,快照读的时候也需要,所以不会被立即删除,而insert只会在回滚的时候才需要,所以在事务提交的时候可以立即删除,下面来看看实例分析:

借用一下黑马程序员的图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以上的示例列举的进行修改操作时的MVCC的版本链的控制,而执行查询操作的时候,则涉及到了另一个组件readView

readview

读视图,是快照读SQL执行时MVCC提取数据的依据,记录并维护当前活跃的事务(未提交)的id,包含四个核心字段:

m_ids:当前活跃的事务ID的集合

min_trx_id:最小的活跃事务ID

max_trx_id:预分配事务ID,当前最大事务ID + 1

creator_trx_id:readview创建者的事务ID

版本链访问规则:

trx_id(当前事务ID) == creator_trx_id:ok,说明数据是当前事务更改的。

trx_id < min_trx_id:ok,说明数据已经提交。

trx_id > max_trx_id:no,该事务是在readview生成后才开启的。

min_trx_id <= trx_id <= max_trx_id && trx_id 不存在于m_ids中:ok,数据已经提交。

readview生成时机在不同隔离级别有所不同:

read committed:事务每次执行快照读时,都会生成。(这里建议去看看黑马的视频里面的分析)

repeatable read:在事务第一次执行快照读时生成readview,后续复用这个readview。

ax_trx_id && trx_id 不存在于m_ids中:ok,数据已经提交。

readview生成时机在不同隔离级别有所不同:

read committed:事务每次执行快照读时,都会生成。(这里建议去看看黑马的视频里面的分析)

repeatable read:在事务第一次执行快照读时生成readview,后续复用这个readview。

这样,原理就介绍完毕了。


下午把lab做完了,继续学可能效率不太高,就把之前欠的账补上了。

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

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

相关文章

RNN、LSTM、GRU汇总

RNN、LSTM、GRU汇总 0、论文汇总1.RNN论文2、LSTM论文3、GRU4、其他汇总 1、发展史2、配置和架构1.配置2.架构 3、基本结构1.神经元2.RNN1. **RNN和前馈网络区别&#xff1a;**2. 计算公式&#xff1a;3. **梯度消失:**4. **RNN类型**:&#xff08;查看发展史&#xff09;5. **…

django数据迁移操作受阻

错误信息&#xff1a; django.db.utils.OperationalError: (1227, Access denied; you need (at least one of) the SYSTEM_VARIABLES_ADMIN or SESSION_VARIABLES_ADMIN privilege(s) for this operation)根据错误信息分析&#xff0c;该问题是由于MySQL用户 缺乏SYSTEM_VARI…

WinForm真入门(13)——ListBox控件详解

WinForm ListBox 详解与案例 一、核心概念 ‌ListBox‌ 是 Windows 窗体中用于展示可滚动列表项的控件&#xff0c;支持单选或多选操作&#xff0c;适用于需要用户从固定数据集中选择一项或多项的场景‌。 二、核心属性 属性说明‌Items‌管理列表项的集合&#xff0c;支持动…

局域网内文件共享的实用软件推荐

软件介绍 在日常办公、学习或家庭网络环境里&#xff0c;局域网内文件共享是个常见需求。有一款免费的局域网共享软件非常适合这种场景。 这款局域网共享软件使用起来非常简单&#xff0c;不需要安装&#xff0c;直接点击就能使用。 它的操作流程简单易懂&#xff0c;用户只要…

ViewModel vs AndroidViewModel:核心区别与使用场景详解

在 Android 的 MVVM 架构中&#xff0c;ViewModel 和 AndroidViewModel 都是用于管理 UI 相关数据的组件&#xff0c;但二者有一些关键区别&#xff1a; 1. ViewModel 基本用途&#xff1a;用于存储和管理与 UI 相关的数据&#xff0c;生命周期与 Activity/Fragment 解耦&…

C语言--求n以内的素数(质数)

求n以内的素数&#xff0c;可以用试除法或者埃拉托斯特尼筛法&#xff08;埃氏筛法&#xff09; 文章目录 试除法埃拉托斯特尼筛法&#xff08;埃氏筛法&#xff09;两种方法测试运行效率 输入&#xff1a;数字n 输出&#xff1a;n以内所有的素数 不管是哪个方法&#xff0c;都…

Skynet.socket 函数族使用详解

目录 Skynet.socket 函数族使用详解核心功能分类一、TCP 连接管理1. 监听端口2. 建立连接3. 关闭连接 二、数据读写操作1. 阻塞式读取2. 写入数据2.1 socket.write(fd, data) 的返回值2.2 示例代码2.3 关键注意事项2.4 与其他函数的区别2.5 底层原理2.6 总结 三、UDP 处理1. 创…

Unity Addressables资源生命周期自动化监控技术详解

一、Addressables资源生命周期管理痛点 1. 常见资源泄漏场景 泄漏类型典型表现检测难度隐式引用泄漏脚本持有AssetReference未释放高异步操作未处理AsyncOperationHandle未释放中循环依赖泄漏资源相互引用无法释放极高事件订阅泄漏未取消事件监听导致对象保留高 2. 传统管理…

aws(学习笔记第三十八课) codepipeline-build-deploy-github-manual

文章目录 aws(学习笔记第三十八课) codepipeline-build-deploy-github-manual学习内容:1. 整体架构1.1 代码链接1.2 全体处理架构2. 代码分析2.1 创建`ImageRepo`,并设定给`FargateTaskDef`2.2 创建`CodeBuild project`2.3 对`CodeBuild project`赋予权限(`ECR`的`image rep…

在windows服务器使用Nginx反向代理云端的python实现的web应用

近日得闲&#xff0c;计划将之前写过的一些小桌面程序搬到云服务器上方便随时随地使用&#xff0c;同时也学习一些基本的网站开发和搭建知识&#xff0c;于是在AI的帮助下&#xff0c;基于niceguifastapi非常快捷地搞出来了一个前后端一体的网站程序&#xff0c;放在云服务器上…

全球贸易战火重燃:50%关税如何绞杀跨境电商低价模式?

一、政策高压&#xff1a;美国对华贸易战升级路线图 2024年5月&#xff0c;美国国会《数字贸易壁垒法案》草案曝光&#xff0c;标志着中美贸易博弈进入新阶段&#xff1a; • 关税武器精准打击&#xff1a;成衣、消费电子、小家电税率拟从10-25%跃升至50% • 监管范围扩大&…

0411 | 软考高项笔记:项目立项

在软考的项目管理知识体系中&#xff0c;技术可行性和经济可行性是项目立项阶段非常重要的两个分析维度。以下是对这两个考点的详细解释和记忆方法&#xff1a; 技术可行性分析 定义&#xff1a; 技术可行性分析是评估项目在现有技术条件和资源下是否能够成功实施。它主要回答…

二分查找3:69. x 的平方根

链接&#xff1a;69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; 本题本质是二分查找右端点 x的算数平方根一定在1 ~ x 区间内&#xff0c;在1 ~ x区间内查找一个数num&#xff0c;num^2x&#xff0c;但实际上num不一定是整数&#xff0c;所以是n…

oracle大师认证证书有用吗

专业能力的高度认可&#xff1a;OCM 是 Oracle认证的最高级别&#xff0c;是对数据库从业人员技术、知识和操作技能的最高级认可&#xff0c;也是 IT 界顶级认证之一。它表明持证者具备处理关键业务数据库系统和应用的能力&#xff0c;能够解决最困难的技术难题和最复杂的系统故…

InnoDB 如何解决幻读:深入解析与 Java 实践

在数据库事务管理中&#xff0c;幻读&#xff08;Phantom Read&#xff09;是并发操作中常见的问题&#xff0c;可能导致数据一致性异常。MySQL 的 InnoDB 存储引擎通过其事务隔离机制和多版本并发控制&#xff08;MVCC&#xff09;&#xff0c;有效解决了幻读问题。作为 Java …

【AI编程技术爆发:从辅助工具到生产力革命】

目录 前言&#xff1a;技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解关键技术模块技术选型对比 二、实战演示环境配置要求核心代码实现运行结果验证 三、性能对比测试方法论量化数据对比&#xff08;2023年数据&#xff09;结果分析 四、最…

ICRA-2025 | 视觉预测助力机器人自主导航!NavigateDiff:视觉引导的零样本导航助理

论文&#xff1a;Yiran Qin 1 , 2 ^{1,2} 1,2, Ao Sun 2 ^{2} 2, Yuze Hong 2 ^{2} 2, Benyou Wang 2 ^{2} 2, Ruimao Zhang 1 ^{1} 1单位&#xff1a; 1 ^{1} 1中山大学&#xff0c; 2 ^{2} 2香港中文大学深圳校区论文标题&#xff1a;NavigateDiff: Visual Predictors are Ze…

【ESP32S3】GATT Server service table传送数据到调试助手

前言 在初步学习esp32蓝牙的过程中&#xff0c;借鉴了官方的GATT Server Service Table Example&#xff0c;可以在readme中看到&#xff0c;此demo是采用低功耗蓝牙的通用属性服务器来创建订阅服务和特性。如果你接触过MQTT&#xff0c;你会发现GATT Server这一特性和MQTT的订…

DeepSeek :中国 AI 如何用 “小米加步枪” 逆袭硅谷

2025 年春节前夕&#xff0c;人工智能领域诞生了一项重大成果 ——DeepSeek 发布DeepSeek - R1 大模型。这一模型迅速引发广泛关注&#xff0c;在苹果 AppStore 中国区免费榜登顶。 DeepSeek 采用开源策略&#xff0c;依据宽松的 MIT 许可证&#xff0c;公开了模型权重、训练方…

关税扰动下市场波动,如何寻找确定性的长期之锚?

近期的关税纷争&#xff0c;扰动全球资本市场下行。A股市场一度大幅下跌。但随着各大主力下场&#xff0c;有关部委发布有关有力措施&#xff0c;A股逐步稳住阵脚。 4月8日至4月10日&#xff0c;大盘指数连续3天上涨&#xff0c;上涨120多点&#xff0c;展现出较强的抵御关税壁…