【MySQL技术内幕】:InnoDB存储引擎体系架构及关键特性

InnoDB体系架构 后台线程 学习了一段MySQL之后,感觉到很多东西不深入理解存储引擎无法更好的进行数据库的设计和使用,所以记录下所学的东西,方便自己和他人。 InnoDB的存储引擎的架构体系如下图所示(图片来自MySQL技术内幕): 从图中我们可以清楚的看到InnoDB存储引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责一下的工作: 1.维护所有进程/线程需要访问的多个内部数据结... 阅读详情

前言

MySQL是目前互联网的主流数据库,而InnDB更是核心应用表的首选存储引擎。本篇重在介绍InnnoDB存储引擎的体系架构及特性。

1 InnoDB的体系架构

如下图所示,InnoDB有多个内存块,主要负责如下工作:

  1. 维护所有进程/线程需要访问的多个内部数据结构。
  2. 缓存磁盘上的数据,方便迅速地读取,并且在对磁盘文件的数据进行修改之前在这里缓存。
  3. 重做日志(redo log)缓冲。
    在这里插入图片描述后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外还负责将已修改的数据文件刷新到磁盘文件。
1.1 后台线程

InnoDB的后台线程有7个:4个IO thread(insert buff thread、log thread、read thread、write thread)、1个master thread,1个锁监控线程,1个错误监控线程。

1.2 内存

InnoDB内存由以下三部分组成:

  1. 缓冲池(buffer pool)
  2. 重做日志缓冲池(redo log buffer)
  3. 额外的内存池(additional memory pool)

缓冲池的工作方式:
• 读:将数据库文件按页(每页16K)读取到缓冲池,然后按照LRU算法来保留在缓冲池中的缓存数据。
• 写:每次写数据库文件,都是先修改在缓冲池中的页(发生修改后,该页即为脏页),然后再按照一定的频率将缓冲池的脏页刷新到文件。

可以通过 SHOW ENGINE INNODB STATUS命令来查看缓冲池的具体使用情况,在结果里的 BUFFER POOL AND MEMORY里看到缓冲池使用情况:buffer pool size表明一共有多少个缓冲帧(buffer frame),每个缓冲帧16K,Database pages表示已经使用的缓冲帧,Modified db pages表示脏页的数量。

缓冲池中缓存的数据页类型包括:索引页、数据页、undo页,插入缓冲(insert buffer)、自适应哈希索引(adaptive hash index)、InnoDB存储的锁信息、数据字典信息等。
重做日志缓冲池将重做日志信息先放入这个缓冲区,然后按照一定频率将其刷新到重做日志文件。默认每秒刷新一次,因此该缓冲区的内存值一般不用设置太大。
额外的内存池,主要是为了在对一些数据结构本身分配内存时,需要从该区域申请。
在这里插入图片描述

2 master thread

2.1 master thread的工作原理

我们现在已经知道InnoDB存储引擎的主要工作都是在一个单独的后台线程master thread中完成的。通过阅读源码,可知master thread线程优先级最高,其中包括了四个循环:主循环(loop)、后台循环(background loop)、刷新循环(flush thread)、暂停循环(suspend thread)。
loop称为主循环,因为大部分的操作都在该循环中完成的,其中又有两大部分的操作:每秒钟的操作和每十秒钟的操作。
每秒一次的操作包括:
• 重做日志缓冲刷新到磁盘redo log文件,即使该事务还没提交。这也解释了为什么再大的事务commit的时间也是很快的。
• InnoDB引擎会判断当前一秒的IO次数,如果小于5次,则认为当前IO压力很小,就会执行合并插入缓冲的操作。
• InnoDB会判断当前缓冲池中脏页的比例是否超过了配置文件的参数(默认90,代表90%),如果超过这个阈值,则会将至多100个脏页写入磁盘。
• 如果当前用户没有活动,则切换到background loop。
每十秒一次的操作包括:
• InnoDB会判断过去10秒之内的磁盘IO操作是否小于200次,如果是则认为当前有足够的磁盘IO能力,因此将100个脏页刷新到磁盘。
• 合并至多5个插入缓冲。
• 将日志缓冲刷新到磁盘。
• 执行full purge操作,删除无用的undo页。事实上在对MySQL表执行update、delete操作时,原先的行被标记为删除,但是由于一致性读的关系,需要保留这些行版本的信息。在full purge的过程中,InnoDB会判断当前事务系统已被删除的行是否可以删除(比如有时候可能还有查询操作需要读取之前的版本的undo信息),如果可以,InnoDB会立即将其删除。
• 刷新100个(脏页的比例大于70%)或10个(脏页的比例小于70%)脏页到磁盘。
• 产生一个检查点(checkpoint)。将最老日志序列号(oldest LSN)的页写入磁盘。

2.2 master thread的潜在问题

• InnoDB最多只会刷新100个脏页到磁盘,合并20个插入缓冲,实际上每秒可能会产生大于100个脏页或产生大于20个插入缓冲,当固态硬盘出现时,这个规则很大程度上限制了磁盘IO的性能。并且在发生服务器宕机时由于很多数据还没刷回磁盘,可能恢复需要较长时间。
• InnoDB默认脏页占缓冲池超过90%的容量时就触发脏页刷新到磁盘的操作,但是这个比例也太大了,很容易造成脏页积压,给数据库服务器带来压力。

3 关键特性

3.1 插入缓冲:insert buffer

插入缓冲是InnoDB搜索引擎最令人激动的关键特性。首先我们知道,MySQL有聚集索引和非聚集索引,插入聚集索引一般是顺序的,不需要磁盘的随机读取,此时插入速度很快就能执行完成。但是对于非聚集且不是唯一的索引,由于B+树的特性,叶子节点的插入就不再是顺序得了,此时就需要离散的访问非聚集索引页,插入性能在这里就下降了。所以引入了插入缓冲。
插入缓冲:对非聚集索引的插入或更新操作,不是每一次直接插入索引页中,而是先判断插入的非聚集索引页是否在缓冲池中。如果在,则直接插入,如果不在,则先放入一个插入缓冲区,然后再以一定的频率执行插入缓冲和非聚集索引页子节点的合并操作,这时通常能将多个插入合并到一个操作中,这就大大提高了对非聚集索引的插入和修改的性能。
但是插入缓冲也是有限制条件的:
• 索引必须是辅助索引。
• 索引不能是唯一的。

3.2 两次写:double write

如果说插入缓冲带给InnoDB存储引擎的是性能,两次写带来的则是数据的可靠性。当数据库宕机时,如果此时正在写一个页面,而这个页面只写了一部分(比如16K的页面只写了6K),此时就会发生部分写失效(partial page write)进而导致数据丢失。
也许你会想,不慌,我们有redo log,保证数据可靠性。想法很好,但是必须清楚的是,redo log记录的是对页的物理操作,如果这个页本身已损坏,redo log日志中记录的数据必然也是损坏的,此时再去重做已然没有意义。

所以聪明的开发者设计了一种页的副本,当写入失效发生时,先通过页的副本来还原该页,再通过redo log进行重做,这就是double write。

在这里插入图片描述
如上图所示,InnoDB会将脏页拷贝的double buffer,之后double buffer再分两次,每次写入1MB到共享表空间的物理磁盘上(此时是顺序写),然后再将double buffer中的页写入到各个表空间的数据文件中(此时是离散写),这就是两次写的过程。
那么在磁盘写入的过程崩溃了怎么办呢?可以看到,共享表空间有该页的一个副本,将其拷贝到表空间文件,再通过redo log即可恢复数据。

3.3 自适应哈希索引:adaptive hash index

InnoDB存储引擎会监控表上索引的查找,如果观察到建立哈希索引可以带来速度的提升则建立哈希索引,所以称之为自适应的。自适应哈希索引通过缓冲池的B+树构造,速度很快。而且不需要将整张表都建哈希索引,只是某些页建立。

Mysql技术内幕InnoDB存储引擎——InnoDB存储引擎 特此申明: 前段时间找工作所以看了《Mysql技术内幕InnoDB存储引擎》,整理的时候除了参考网上已有的笔记贴,加上自己整合的,可能和别人有雷同之处。不过无所谓啦,写出来自己看看,需要的朋友参考下,仅此而已。 一.mysql体系结构和存储引擎 1.1、数据库和实例的区别          数据库:物理操作系统或其他形式文件类型的集合。在mysql下数据库文件可以是frm, 阅读详情

相关推荐

MySQL体系结构及原理(innodb)图文完美解析

MySQL体系结构及原理(innodb)图文完美解析

【Mysql高级特性】 初探 InnoDB 体系架构

【Mysql高级特性】 初探 InnoDB 体系架构

1999的博客 1304

STM32移植u8g2库(HAL库)(硬件SPI)(sh1106_128x64)

STM32移植u8g2库(HAL库)(硬件SPI)(sh1106_128x64) MCU型号为STM32F103RCT6,OLED屏为中景园电子1.3寸屏,驱动芯片为sh1106,分辨率为128x64,MDK版本为V5.34。

Master_0_的博客 6272

Mysql是怎样运行的之InnoDB介绍

InnoDB是一个将表中的数据存储到磁盘上的存储引擎,所以即使关机后重启我们的数据还是存在的。而真正处理数据的过程是发生在内存中的,所以需要把磁盘中的数据加载到内存中,如果是处理写入或修改请求的话,还需要把内存中的内容刷新到磁盘上。而我们知道读写磁盘的速度非常慢......

猿小许的博客 1144

Burp Suite手工验证CORS漏洞的四步闭环法

CORS(跨域资源共享)是Web应用实现跨域通信的基础机制,其安全本质在于服务端对Origin头的校验逻辑与响应头组合的语义一致性。当服务端错误地返回Access-Control-Allow-Origin: *并配合Access-Control-Allow-Credentials: true,或采用弱校验(如字符串包含匹配)时,将导致敏感数据泄露与凭据劫持风险。该漏洞难以被自动化扫描器发现,因其依赖请求上下文、认证状态及动态策略判断。Burp Suite作为核心工具,需通过构造跨域请求、捕获预检响应、交叉验

weixin_30596343的博客 512

【数据集】2019年中国1km格网河网密度数据集

中国1km格网河网密度数据集

WW、forever的博客 1344

MySQL高级篇06【InnoDB数据存储结构】

MySQL中InnoDB引擎的数据存储结构,详细介绍了MySQL存储的基本单位,以及存储原理,和存储方案。

大脑不能为空 812

Claude Code 从入门到精通,通过实战项目穿插 Agent Skills、MCP、Hooks、子代理、插件等十五个知识点

本文介绍了Claude Code的高级使用技巧,通过一个个人简历网站实战项目,详细讲解了15个核心知识点。主要内容包括:三种权限模式(默认/编辑/计划)的使用与切换;历史会话管理(/resume、/rename、/clear命令);会话回滚功能(/rewind);以及危险参数--dangerously-skip-permissions的注意事项。文章还演示了如何通过计划模式拆分代码文件,并强调了在复杂任务中仔细检查规划步骤的重要性。这些技巧能帮助开发者更高效地使用Claude Code完成项目开发。

1788

MySQL — InnoDB引擎、MySQL架构、事务原理、MVCC

我们之前在这个文章中粗略的介绍了一下InnoDB存储引擎 MySQL——存储引擎与索引应用下面内容以理解为主InnnoDB存储结构图TableSpace: 表空间索引、数据,都是在表空间中存储的,是最外层的逻辑结构。表空间(ibd文件),一个MySQL实例可以对应多个表空间,用于存储记录、索引等数据​ 在表空间中又包含很多的段(Segment)表空间是由各个段组成的,段分为数据段、索引段、回滚段等InnoDB是索引组织表,数据段就是B+树的叶子结点,索引段即为B+树的非叶子结点InnoDB中

weixin_51351637的博客 729

基于MATLAB的最大重叠离散小波变换(MODWT)算法详解

最大重叠离散小波变换(Maximal Overlap Discrete Wavelet Transform, MODWT)是DWT的重要改进形式,由Percival和Walden等人在20世纪90年代系统提出并完善。MODWT通过消除下采样操作,采用样本平移不变的分解方式,解决了DWT的多个固有缺陷。MODWT的核心创新在于取消下采样环节。与DWT每级分解后对滤波输出进行二分下采样不同,MODWT在每一级都使用相同的滤波器,但通过插入零值的方式调整滤波器系数,保持每级系数数量与原始信号相同。

qq_42212808的博客 115

【AIGC】Qwen3-Embedding:Embedding与Rerank模型新标杆

Qwen3-Embedding:文本嵌入与重排序模型的技术解析与应用实践

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 3094

【数据库】MySQL InnoDB存储引擎详解 - 读书笔记

特性支持B-tree 索引是备份/点恢复(在服务器中实现,而不是在存储引擎中)是集群数据库支持否聚集索引是压缩数据是数据缓存是加密数据是(在服务器中通过加密函数实现;在 MySQL 5.7 及更高版本中,支持数据静止加密。外键支持是全文搜索索引是(从 MySQL 5.6 开始支持全文索引。地理空间数据类型支持是地理空间索引支持是(从 MySQL 5.7 开始支持地理空间索引。哈希索引否(InnoDB 内部使用哈希索引来实现其自适应哈希索引功能。索引缓存是。

FixPng的博客 2515

超十万字解读Spring AI实战:开篇

大模型技术正以惊人的速度改变世界,2025年的人工智能已不再是科幻,而是现实。大模型如ChatGPT等,正在重塑各行各业,降低技术门槛,使专业能力普及化。SpringAI的出现为Java开发者提供了桥梁,使其能在企业级系统中稳定运行AI,同时保持工程化思维。尽管SpringAI在生态、学习成本和性能上存在不足,但其企业级基因和国产化适配能力使其成为Java开发者的重要工具。本系列文章旨在介绍SpringAI的功能与特性,鼓励更多Java开发者参与AI实践,共同探索AI时代的无限可能。

liaokailin的专栏 1577

MySQL技术内幕 InnoDB存储引擎——第2章 InnoDB存储引擎(未完待续)

第2章 InnoDB存储引擎 2.1 InnoDB存储引擎概述 InnoDB存储引擎是第一个完整支持ACID事务的MySQL存储引擎(BDB是第一个支持事务的MySQL存储引擎,现在已经停止开发)。 特点: 行锁设计 支持MVCC 支持外键 提供一致性非锁定读 被设计用来最有效地利用以及使用内存和CPU 2.2 InnoDB存储引擎的版本 MySQL 5.1版本中支持两个版本的InnoDB,一个是静态编译的InnoDB版本(老版本的InnoDB);另一个是动态加载的InnoDB版本(InnoDB Plu

页页的博客 4983

Spring Boot集成ShardingSphere实现数据加密及数据脱敏 | Spring Cloud 48

利用ShardingSphere实现: - 数据加密 - 数据脱敏

gmHappy 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MySQL技术内幕 InnoDB存储引擎(学习笔记总结)

InnoDB是事务安全的存储引擎。是OLTP应用中核心表首选存储引擎。特点:**行锁设计、MVCC、外键、一致性非锁定读。**被设计用来最有效使用内存和CPU。事实证明InnoDB是一个高性能、高可用、高可扩展性的存储引擎。MySQL数据的存储是根据表进行的,每个表都有与之对应的文件。无论采用何种存储引擎,MySQL都有一个以.frm为后缀名的文件,该文件记录了该表的表结构定义。

yxtudou的博客 1638

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

MySQL技术内幕 - 第二章 InnoDB存储引擎

一、InnoDB 存储引擎概述 InnoDB 存储引擎最早由 Innobase Oy 公司旰发,被包括在 MySQL 数据库所有的二进制发行版本中,从 MySQL 5.5 版本开始是默认的表存储引擎(之前的版本 InnoDB 存储引擎仅在 Windows 下为默认的存储引擎)。该存储引擎是第一个完整支持 ACID 事务的 MySQL 存储引擎(BDB 是第一个支持事务的 MySQL 存储引擎,现在已经停止开发),其特点是行锁设计、支持 MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有效地利用以及使

SongYu的博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Mysql技术内幕(一)--Mysql体系和InnoDB存储引擎(超详细)

Mysql技术内幕(一)--Mysql体系和存储引擎前言一.Mysql体系结构和存储引擎1.1 数据库和实例1.2 Mysql体系结构1.3 Mysql存储引擎1.3.1 InnoDB引擎存储策略和存储大小事务的ACIDMVCC和隔离级别Next-Key LocksInnoDB的4大特性1.3.2 MyISAM引擎(了解)MyISAM和InnoDB的区别二.InnoDB存储引擎 前言 其实我想写一篇跟Mysql有关的博客很久了,一方面是想自己做一个较为全面的知识总结,一方面,现在再看《Mysql技术内幕-I

Zong_0915的博客 4328

MySQL技术内幕:MySQL—InnoDB存储引擎体系架构——详解

InnoDB存储引擎体系架构 1.存储引擎 1.1概念 首先明确一个概念,存储引擎是基于表的,不是基于数据库的 其次存储引擎指的是表的底层物理结构的实现,也就是表在底层是如何存储的,不同的存储引擎存储表的物理结构不同 MySQL数据库最大的特点就是插件式的表存储引擎,即支持多种存储引擎,目前默认的存储引擎是InnoDB,但是其还支持:MyISAM,NDB,Memory,Archive,Federated,Maria等存储引擎,不同的存储引擎有着自己管理表和存储表的方式 下图为Mysql数据库的体系结构图,

weixin_44844089的博客 1308

《MySQL技术内幕一》InnoDB 体系架构

《MySQL技术内部-InnoDB存储引擎》学习笔记一 文章目录《MySQL技术内部-InnoDB存储引擎》学习笔记一@[toc]查看MySQL配置文件查看数据库存储路径第2章 InnoDB 体系架构查看InnoDB中的线程信息内存相关的东东关键特性第3章 文件慢查询日志二进制日志 - binary logInnoDB的表空间文件InnoDB的重做日志文件 2019-04-24 开始学习 ε=(...

程序员的日常学习 954

详解MySQL存储引擎Innodb

InnoDB存储引擎有多个内存块,这些内存块组成了一个大的内存池。后台线程主要负责刷新内存池中的数据、将已修改的数据刷新到磁盘等等。

Elegance never goes out of fashion 3192

MySQL技术内幕:InnoDB存储引擎

过去这些年,我一直在和各种不同的数据库打交道,见证了MySQL从一个小型的关系型数据库发展成为各大企业的核心数据库系统的过程,并且参与了一些大大 小小的项目的开发工作,成功地帮助开发人员构建了一些可靠、健壮的应用程序。在这个过程中积累了一些经验,正是这些不断累积的经验赋予了我灵感,于是有了《MySQL技术内幕:InnoDB存储引擎》。这本书实际上反映了这些年来我做了哪些事情,汇集了很多同行每天可能都会遇到的一些问题,并给出了解决方案。

华章IT官方博客 1419

《MySQL技术内幕》之InnoDB存储引擎

目录InnoDB引擎概述InnoDB的体系架构后台线程内存Checkpoint技术Master Thread工作方式1.0.x版本之前1.2.x版本之前1.2.x版本InnoDB的关键特性插入缓冲(Insert Buffer)两次写(Double Write)自适应哈希索引(Adaptive HashIndex)异步IO(Async IO)刷新邻接页(Flush Neighbor Page) InnoDB引擎概述 InnoDB是事务安全的MySQL存储引擎,设计上采用了类似于Oracle数据库的架构。通常

weixin_40460171的博客 609

【亲测免费】 MySQL技术内幕 InnoDB存储引擎 第2版 资源分享

MySQL技术内幕 InnoDB存储引擎 第2版 资源分享 【下载地址】MySQL技术内幕InnoDB存储引擎第2版资源分享 本仓库提供了一份名为《MySQL技术内幕 InnoDB存储引擎》的PDF资源文件,该文件详细介绍了MySQL数据库中InnoDB存储引擎的相关技术内幕。内容涵盖了MySQL的体系结构、存储引擎、文...

gitblog_06655的博客 726

MySQL 技术内幕:InnoDB存储引擎

MySQL 技术内幕:InnoDB存储引擎 【下载地址】MySQL技术内幕InnoDB存储引擎 探索MySQL核心引擎InnoDB的奥秘,本书《MySQL 技术内幕:InnoDB存储引擎》为你揭开数据库内部机制的神秘面纱。从存储结构到事务锁,从缓存管理到性能调优,本书深入浅出地解析了InnoDB的每一个关键环节。无论你是...

gitblog_06785的博客 368
上一篇: 一次线上SQL查询的索引失效问题排查过程,阿里P7看了也直呼内行
下一篇: 【搞定面试官】系列:缓存雪崩、缓存击穿、缓存穿透
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值