MySQL之InnoDB架构浅析

news2025/7/11 4:13:48

InnoDB是一个兼顾高可靠性和高性能的通用存储引擎。在 MySQL 5.7 中,InnoDB是默认的 MySQL 存储引擎。

InnoDB 的主要优势

  • 支持事物,具备crash-safe的能力
  • 支持行锁以及MVCC,具备良好的多用户并发性和性能
  • Buffer Pool,提升热点数据的查询效率以及数据频繁更新时的效率
  • 聚簇索引,基于主键的查询有更小的IO次数,更加高效
  • 支持外键

架构图

在这里插入图片描述

Buffer Pool

Buffer Pool用于在 InnoDB访问时缓存表和索引数据,并且对于热点数据的访问有很好的加速效果。

Buffer Poold在内存中以链表的形式存在,该链表基于变种LRU进行管理。当新的数据页被添加到Buffer Pool时,会被添加到这个链表靠近中间的位置,这个位置被称为“midpoint”。这种插入策略将链表分成了两个子链表:

  • 靠近头部的一端是最近经常访问的热点数据(new区)
  • 靠近尾部的一端是最近较少访问的冷数据(old区)

在这里插入图片描述

当数据页被添加到old区后,如果该数据页又被再次访问了,并且其被添加到old区的时间超过一个阈值(默认是一秒,由innodb_old_blocks_time控制),则该数据页会被挪到new区的头部,其他数据向尾部移动。

随着数据页的不断读入以及链表中数据页访问频率的变化,new区跟old区中的某些数据页会不断的向尾部移动,直到最终被移除。

Change Buffer

Change Buffer用于缓存二级非唯一索引页的更新操作,加速insert、update、delete这类语句的执行效率。

相对于聚集索引,二级索引的插入顺序相相对随机,此时需要将数据页读入内存来判断插入位置,这个过程会产生很多随机IO。

对于二级索引中的非唯一索引,索引页的更新肯定不会引发唯一约束的冲突。此时便可以直接将更新操作保存在内存中,等到真正需要用到这些更新影响到的索引页时,再将这些更新应用到被影响的索引页即可。这种方式可以避免大量的随机IO访问,并且,读取之前更新的次数越多,收益越高。

可以通过innodb_change_buffering改变执行策略

  • all

    默认值:缓冲插入、删除和purge。

  • none

    不要缓冲任何操作。

  • inserts

    缓冲插入操作。

  • deletes

    缓冲删除操作。

  • changes

    缓冲插入和删除操作。

  • purges

    缓冲在后台发生的物理删除操作。

通过innodb_change_buffer_max_size 指定Change Buffer在Buffer Pool中的占比。默认25%,最大50%。

Redo Log

Redo Log用于实现事物的持久性(Durability),它让MySQL拥有了崩溃恢复能力。

Redo Log通过追加的方式进行数据写入,且记录的是数据的变化(表空间号、数据页号、磁盘文件偏移 量、更新值)。这样有两个好处,第一是顺序IO,第二是减少了刷到磁盘的数据量(16KB可以记录许多个数据页的改动)。这也是为什么不直接用数据文件或者Doublewrite Buffer来实现持久性的原因。

Redo Log由以两部分组成:

  1. Log files(默认100MB,最大128GB):磁盘上的文件,大小固定。通过checkpoint技术实现循环写入。

  2. Log Buffer(默认为 16 MB):内存区域,用于保存事物运行中需要被被写入到redo log的数据。这些数据默认会在事物提交时从内存刷入磁盘,当然,如果事物过大,Log Buffer不足以完全缓存这些数据,则会提前刷盘。

    同时,可以通过指定innodb_flush_log_at_trx_commit来控制Log Buffer里的数据如何写入和刷新到磁盘。有如下三个选项:

    • 1 :每次提交事务时刷盘
    • 0:默认每秒刷盘一次,可通过innodb_flush_log_at_timeout指定间隔。未刷盘事务可能会在crash中丢失
    • 2:事物提交后先写到os cache,并每秒刷盘。未刷盘事务可能会在crash中丢失

    Log Buffer通过对Redo log的批量刷盘(不同事物同时提交时会一起刷),避免了频繁的磁盘IO。

两阶段提交

由于BinLog处于Server层,Redo Log处于存储引擎层。为了保证Redo Log跟BinLog的一致性,在InnoDB写完Redo Log后会先通知执行器RedoLog已写入(prepare)。然后执行器会对BinLog执行写入操作。等到BinLog写入成功,执行器通知InnoDB,事物进入commit。

Doublewrite Buffer

在刷脏页时,数据页首先会被写到Doublewrite Buffer,然后才会被写到Innodb的数据文件。

在InnoDB里,页大小默认为16KB,而OS页大小通常默认时4KB。这意味着**InnoDB将Buffer Pool中一页数据刷入磁盘,要写4个OS页。而这并不是一个原子操作。**如果突然断电,就有可能存在只刷了2个OS页的情况。此时,数据页里部分数据(LSN)已经丢失,像这种情况,是无法靠Redo Log恢复的。

而Doublewrite Buffer里有完整的页信息,所以此时可以从Doublewrite进行恢复。那么,如果在写Doublewrite Buffer的时候断电呢?那就再重启后重新读入数据页并应用Redo Log再重新写DoubleWrite Buffer即可。

Undo Log

Undo Log用于实现事物的原子性(atomicity)以及MVCC。

Undo Log由rollback segments组成,单个表空间默认/最大128个。segmentUndo Slots组成,slot的数量取决于页大小。页大小为16kb时单个segment下slot的数量为1024。slot里存放的是用于回滚的数据变更信息。

segment为Innodb的事物并发提供支持。segment的数量与能够支持的事物并发数正相关,通常一个slot能够支持一个事物。具体计算方式也很简单,参考事物并发数计算。

通过innodb_rollback_segments指定segment数量

MVCC

MVCC全称Multiversion concurrency control,及多版本并发控制。是数据库管理系统
常用的一种并发控制,也用于程序设计语言实现事务内存。

MVCC目的是为了解决读写锁造成的多个、长时间的读操作阻塞写操作的问题。在特定的隔离级别下,事务读操作读到的数据项是一个历史快照,写操作不覆盖已有数据项,而是创建一个新的版本,直至所在操作提交时才变为可见。这种方式使得事务在整个运行过程中看到的都是它启动时的数据状态。

InnoDB 里面每个事务有一个唯一的事务 ID,叫作 transaction id。它是在事务开始的时候向 InnoDB 的事务系统申请,按申请顺序严格递增。

在事物更新数据时,会将transaction id以及更新前的数据保存在undo log中。同时,会将transaction id保存在被修改的行的隐藏列DB_TRX_ID中。行记录中还有一个隐藏列,叫DB_ROLL_PTR,存储的事一个指向rollback segment的指针。如果在该事物未提交时有其他事物来读取该行,就会通过这个指针来回溯并重建未修改前的数据。回溯的程度通过比较读事物跟redo log中的transaction id来决定,读事物能看到的数据必须是在其启动时已经提交的事物作出的数据修改

参考

https://dev.mysql.com/doc/refman/8.0/en

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

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

相关文章

第8章 综合案例—构建DVD租赁商店数据仓库

目录 章节概要 案例背景介绍 数据仓库的架构模型 数据仓库的架构模型 数据库sakila的下载和安装 数据库sakila简介 数据库sakila中 数据表之间的关系 数据表简介 用于储存电影基本信息及相关介绍的数据,该数据表各个字段的含义如表。 用于储存定义电影id所…

Python爬虫

前言 这个故事,从头讲起。 2022 年上班第一天,我们做了一个重要决定,就是打造精品学习路线,为初学者指明前进的方向,以及常见的避坑技巧。 (文末送读者福利) 我承认这是一件非常有挑战的事情…

自动驾驶感知算法实战6——目标分类详解(ResNet、VGG、GoogLeNet等)

自动驾驶感知算法实战专栏:https://blog.csdn.net/charmve/category_12097938.html目录 1 网络分类2 详解 ResNet3 详解 VGG4 稠密连接网络(DenseNet)5 详解 GoogLeNet6 详解 Fast R-CNN1 网络分类 来自:https://charmve.github.io/computer-vision-in-action/#/book_prefa…

构建房地产行业智慧采购新模式,采购协同商城系统护航企业采购数字化转型

采购是房地产企业控制成本的龙头,同时还直接影响着工程质量。随着采购工作推进的不断深化,对地产物资采购精细化管理的要求也在日益加强,如何做好采购工作成为房地产企业实现数字化转型升级进程必须突破的壁垒。 房地产作为一个资源整合性行…

排序算法及java实现

简介 排序算是非常基础的算法,为什么我们需要排序算法呢?假设我们只有10个数,或者100个数,其实根本不需要研究这么多的排序算法,正常我们会使用的插入排序或者选择排序足够了,没必要发明快排,基…

第九章 哈希表 AcWing 2 1549. 集合相似度

第九章 哈希表 AcWing 2 1549. 集合相似度 原题链接 AcWing 1549. 集合相似度 算法标签 哈希表 位运算 思路 使用unordered_set数据结构将数据插入指定集合 如何计算Nc(两集合交集) 如何计算Nt(两集合并集) 输出问题 WA 精…

干掉 “重复代码”,这三种方式绝了!

软件工程师和码农最大的区别就是平时写代码时习惯问题,码农很喜欢写重复代码而软件工程师会利用各种技巧去干掉重复的冗余代码。 业务同学抱怨业务开发没有技术含量,用不到设计模式、Java 高级特性、OOP,平时写代码都在堆 CRUD,个…

BCD编码和ASCII码

计算机里,字母,各种字符以及指挥计算机执行操作的指令,均用二进制数的组合表示,称为二进制编码 目录 ASCII码(汇编语言程序设计的时候会常用) BCD码(了解) ASCII码(汇…

等数值计算方法学习笔记第4章第三部分【数值积分(数值微分)】

高等数值计算方法学习笔记第4章第三部分【数值积分(数值微分)】六、数值微分(第四次课)1、中点方法与误差分析2、插值型的求导公式3、习题和表格4、知识结构图六、数值微分(第四次课) 1、中点方法与误差分析…

【图像处理】小波编码图像中伪影和纹理的检测(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

一年一度的科技狂欢盛会——2022亚马逊云科技re:Invent全球大会

一年一度的科技狂欢盛会,2022年亚马逊云科技re:Invent全球大会即将于北京时间2022年11月29日盛大开启!届时全球各领域关注“云计算圈”发展的人都将齐聚一堂,共同聆听5大重磅嘉宾的主题演讲,700前沿技术话题…… 携全球合作伙伴&…

《计算机工程》投稿经验分享

历经两个月终于录用了 投稿过程真的太心酸了 第一次投计算机工程与应用:历时两周,拒稿 第二次投计算机科学:加急15天,增刊录用,撤稿 第三次投计算机应用与软件:说文件太大,修改文件大小重投&…

选择合作伙伴是最大关键:网宿科技的云业务拓展之路

关注IT圈子的小伙伴们,对网宿科技这个名字想必都是耳熟能详。在众多发力云计算业务的科技企业当中,近年来业绩表现出众的网宿科技,无疑是相当引人瞩目的一家。那么问题就来了:网宿科技当初是怎样走上了这条云业务拓展之路&#xf…

【知识网络分析】二模网络(two node)、多模网络(multi node)与多级别网络(multi level)

二模网络(two node)、多模网络(multi node)与多级别网络(multi level) 1 二模网络(two node)1.1 读取本地文献并构建二模网络数据集1.2 网络数据集精简1.3 网络图绘制及美化2 多模网络(multi node)3 多级别网络(multi level)1 二模网络(two node) 1.1 读取本地文…

web期末网站设计大作业 奶茶店网站美食餐饮网站设计与实现(HTML+CSS+JavaScript)

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

【网页设计】HTML做一个属于我的音乐页面(纯html代码)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

JAVA学习笔记- - - day 2

💕前言:作者是一名正在学习JAVA的初学者,每天分享自己的学习笔记,希望能和大家一起进步成长💕 目录 💕前言:作者是一名正在学习JAVA的初学者,每天分享自己的学习笔记,希望…

15.变量的存储类别

变量的存储类别 内存的分区 1.内存:物理内存,虚拟内存。 虚拟内存:操作系统虚拟出来的的内存。 操作系统会再物理内存和虚拟内存之间做映射。 在32位系统下,每个进程的寻址范围是4G:0x00 00 00 00 ~ 0xff ff ff ff …

XSStrike工具使用说明

今天继续给大家介绍渗透测试相关知识,本文主要内容是XSStrike工具使用说明。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:严禁对未授权…

详解设计模式:工厂方法模式

工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过工厂父类定义负责创建产品的公共接口,子类负责生产具体对象。可以理解为简单工程模式的升级,解决简单工厂模式的弊端。 ~ 本篇内容包括:关于…