Innodb架构解析

news2024/11/30 8:31:35

整体架构

通过《面试官:一条SQL是如何执行的?》我们了解了MySQL架构,下面我们看下Innodb架构。

innodb最早由Innobase Oy公司开发,5.5版本开始是MySQL默认存储引擎,该存储引擎是第一个完整支持ACID事务的MySQL存储引擎(BDB是第一个支持事务的MySQL存储引擎,现在已经停止开发),其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有效地利用以及使用内存和CPU。下面我们详细看下innodb架构:

图片

内存架构

  • Buffer Pool(缓冲池)是InnoDB存储引擎中的一个重要组件,用于高效地缓存数据库中的数据页。它是内存中的一块区域,用于存储从磁盘读取的数据页,以加快数据的访问速度。在专用服务器上,通常将物理内存的最多80%分配给缓冲池。当InnoDB需要读取数据页时,首先会在缓冲池中查找该页是否已经被缓存。如果该页已经在缓冲池中,InnoDB可以直接从内存中获取数据,避免了磁盘IO的开销,从而提高数据访问的速度。如果该页不在缓冲池中,InnoDB会将其读取到缓冲池中,并进行相应的缓存管理。Buffer Pool的大小是通过配置参数innodb_buffer_pool_size来指定的。较大的缓冲池可以容纳更多的数据页,提供更好的缓存效果,从而减少磁盘IO操作。合理配置缓冲池的大小对于数据库的性能至关重要,它应该根据数据库的大小、可用内存和访问模式来进行调整。Buffer Pool的作用在于:

    1. 提高数据访问性能:通过缓存数据页,减少磁盘IO,加快数据的读取速度。

    2. 减少磁盘访问:由于数据页已经在内存中,可以减少频繁的磁盘读取操作,降低IO开销。

    3. 优化查询性能:对于频繁访问的数据,可以直接从缓冲池中获取,减少查询的响应时间。

  • Change Buffer

    图片

    Change Buffer是一种特殊的数据结构,用于在次要索引页不在缓冲池中时缓存对其进行的更改。这些缓冲的更改可能来自于插入(INSERT)、更新(UPDATE)或删除(DELETE)操作(DML),它们在后续的读操作将这些页加载到缓冲池时被合并。Change Buffer的目的是降低写操作的磁盘IO,提升数据库性能。

  • Log Buffer 当在MySQL中对InnoDB表进行更改时,这些更改首先存储在InnoDB日志缓冲区的内存中(Log Buffer),然后写入通常称为重做日志(redo logs)的InnoDB日志文件中。日志缓冲区的大小由innodb_log_buffer_size 变量定义,其默认大小为16MB。日志缓冲区的内容会定期刷新到磁盘。较大的日志缓冲区可以使大型事务在提交之前无需将重做日志数据写入磁盘,从而提供更好的性能。因此,如果存在更新、插入或删除大量行的事务,则增加日志缓冲区的大小可以减少磁盘IO操作。 innodb_flush_log_at_trx_commit变量控制日志缓冲区的内容如何写入和刷新到磁盘。innodb_flush_log_at_timeout 变量控制日志刷新的频率。

磁盘架构

InnoDB存储引擎使用页作为基本单位来管理存储空间,每个页的默认大小为16KB。对于每个索引,InnoDB使用B+树结构,其中每个节点都是一个数据页。数据页之间不必连续存储,而是通过双向链表来维护它们的顺序。

InnoDB的聚簇索引将完整的用户记录存储在叶子节点中,也就是说索引即数据,数据即索引。

为了更好地管理这些页,InnoDB引入了表空间(Tablespace)的概念。表空间是一个抽象的概念,可以对应于一个或多个实际的文件。每个表空间可以被划分为多个页,表的数据存放在特定表空间下的一些页中。InnoDB将表空间划分为几种不同的类型:

  1. 系统表空间(System Tablespace):系统表空间可以对应文件系统上一个或多个实际的文件,默认情况下,InnoDB会在数据目录下创建一个名为ibdata1的文件,这个文件就是对应的系统表空间在文件系统上的表示。这个文件是自扩展文件,当不够用的时候它会自己增加文件大小。也可以把系统表空间对应的文件路径不配置到数据目录下,甚至可以配置到单独的磁盘分区上,涉及到的启动参数就是innodb_data_file_pathinnodb_data_home_dir。需要注意的一点是,在一个MySQL服务器中,系统表空间只有一份。

  2. 独立表空间(File-per-table Tablespace):在MySQL5.6.6以及之后的版本中,InnoDB并不会默认把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。使用独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不过添加了一个.ibd的扩展名。我们也可以自己指定使用系统表空间还是独立表空间来存储数据,这个功能由启动参数innodb_file_per_table控制。

  3. 通用表空间(General Tablespace):通用表空间是MySQL 8中引入的新特性,它允许将多个表存储在一个表空间中。通用表空间可以跨数据库和服务器共享,提供了更高的灵活性和资源利用率。

  4. 临时表空间(Temporary Tablespaces):临时表空间用于存储临时表和临时文件。当执行排序、连接和其他需要临时存储的操作时,InnoDB会使用临时表空间来存储相关数据。

此外,InnoDB还使用其他文件和机制来支持数据管理和恢复:

  1. 双写缓冲文件(Doublewrite Buffer Files):双写缓冲是一种机制,用于提高数据写入的可靠性。InnoDB将数据页首先写入双写缓冲文件中,然后再将其写入实际的数据文件。这样可以在发生故障时,通过双写缓冲文件恢复数据的一致性。

  2. Undo表空间(Undo Tablespaces):撤消表空间用于存储撤消日志(undo log),用于支持事务的回滚和MVCC(多版本并发控制)。每个事务对数据的修改都会生成相应的撤消日志,这些日志被存储在撤消表空间中。

  3. 重做日志(Redo Log):重做日志是用于事务的持久性和故障恢复的重要组件。它记录了事务对数据的修改操作,包括插入、更新和删除。重做日志文件存储在磁盘上,并在事务提交时进行持久化。

这些组件和机制共同构成了InnoDB的磁盘架构,用于管理和存储数据。

InnoDB的工作流程

当用户发起一个数据操作请求时,InnoDB的处理流程大致如下:

  1. 事务开始:InnoDB为每个事务分配一个唯一的事务ID,并在事务开始时创建一个事务对象。

  2. 数据读取:如果数据不在缓冲池中,InnoDB会从磁盘读取数据页面到缓冲池。

  3. 数据修改:修改操作首先在缓冲池中进行,同时记录到重做日志缓冲区。

  4. 日志写入:日志缓冲区定期刷新到重做日志文件,确保数据的持久性。

  5. 提交事务:在事务提交时,InnoDB确保所有相关的重做日志已经写入磁盘,这个过程称为预写日志协议(Write-Ahead Logging, WAL)。

  6. 后台处理:事务提交后,InnoDB的后台线程会负责将缓冲池中修改过的页面异步刷新到磁盘,同时合并插入缓冲和维护其他内部结构。

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

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

相关文章

多线程GUI界面文件复制程序的解决方案

在Python中,你可以使用多线程来编写一个GUI界面的文件复制程序。这样可以使得文件复制过程在后台进行,而不会阻塞用户界面,提升用户体验。下面是一个使用Python的Tkinter库和多线程实现的文件复制程序的示例: 1、问题背景 我们有…

Mac上的最佳3D建模工具-犀牛Rhinoceros 8 for Mac v8.6.24101.05002完美兼容激活

Rhino 8是一款计算机辅助设计(CAD)和三维建模软件,由美国公司McNeel & Associates开发。它是Rhino系列的最新版本,用于创建、编辑、分析、渲染和动画三维模型。 以下是Rhino 8的一些主要特点和功能: 1. **强大的…

今天讲讲MYSQL数据库事务怎么实现的!

目录 什么是数据库事务 Mysql如何保证原子性 Mysql如何保证持久性 MySQL怎么保证隔离性 事务隔离级别 脏读的解决 不可重复读的解决 幻读的解决 MVCC实现 Read View 那么RC、RR级别下的InnoDB快照读有什么不同? 什么是数据库事务 数据库事务是指一组数据…

2024年4月12日 十二生肖 今日运势

小运播报:2024年4月12日,星期五,农历三月初四 (甲辰年戊辰月丙午日),法定工作日。 红榜生肖:羊、狗、虎 需要注意:牛、马、鼠 喜神方位:西南方 财神方位:…

强化学习-深度蒙特卡洛算法(Deep Monte-Carlo)解决骰子游戏“吹牛”

一、算法简介 深度蒙特卡洛算法是一种使用深度神经网络来进行蒙特卡洛估计的强化学习算法,它最早于2020年在《DouZero: Mastering DouDizhu with Self-Play Deep Reinforcement Learning》被提出用于解决斗地主问题。 深度蒙特卡洛算法使用深度网络拟合每个时刻&…

HarmonyOS 开发-阻塞事件冒泡

介绍 本示例主要介绍在点击事件中,子组件enabled属性设置为false的时候,如何解决点击子组件模块区域会触发父组件的点击事件问题;以及触摸事件中当子组件触发触摸事件的时候,父组件如果设置触摸事件的话,如何解决父组…

应对人工智能在金融服务业的迅猛发展

今天分享的是人工智能专题系列深度研究报告:《人工智能专题:应对人工智能在金融服务业的迅猛发展》。 (报告出品方:安永) 评估人工智能对金融服务业的潜在影响 虽然大型银行和保险公司使用人工智能已有多年&#xf…

Rust语言入门第一篇-环境搭建

Rust语言入门第一篇 Rust官网 一,环境搭建 1、C开发环境配置 Rust 语言的底层是依赖于 C/C 编译器的。在安装 Rust 编译器时,通常会自动安装所需的 C/C 编译环境,以便 Rust 能够生成可执行文件或库。因此,在安装 Rust 之前&…

牛客NC413 两个升序数组的中位数【hard 数组,模拟 Java、Go、PHP】

题目 题目链接: https://www.nowcoder.com/practice/b3b59248e61f499482eaba636305474b 思路 直接模拟2个数组有顺序放到一个数组中help中如果help长度为奇数,返回中间的数如果help长度为偶数,返回中间2个数的和除以2参考答案java import j…

【学习】移动端兼容性测试有什么方法及重要性

随着移动互联网的快速发展,移动应用程序已经成为人们日常生活中不可或缺的一部分。然而,由于各种移动设备的硬件和软件差异,移动应用程序的兼容性问题也越来越突出。因此,移动端兼容性测试成为了一个重要的环节,它可以…

jar包瘦身 移除无用的maven依赖

1.进入pom.xml所在目录,执行mvn dependency:analyze Unused declared dependencies found:下的单个包进行逐个移除编译,编译不报错就可以移除

3d怎么按路径制作模型---模大狮模型网

在3D建模中,按路径制作模型是一种常见的技术,特别适用于创建曲线、管道、绳索等线性形状的物体。虽然这项技术可能对初学者来说有些复杂,但通过一步步的指导和实践,你将能够掌握它。本文将详细介绍按路径制作模型的步骤&#xff0…

4月9号总结

java学习 一.steam流 1.介绍 Stream 是 Java 8 中引入的一种处理集合数据的新抽象。它提供了一种高效且便利的方式来处理集合中的元素,支持函数式编程的特性,使得集合操作变得更加简洁和灵活。 2.创建 List和Set可以直接调用接口的steam方法转换为流 …

vue2+codemirror实现指定行背景染色(二 代码染色)

在做覆盖率统计时,我们需要给指定代码行染色高亮,这里使用vue2+codemirror实现代码的渲染和染色。效果图如下: 1、安装 vue-codemirror // 指定安装4.x版本 // 目前最新版本6.x,仅支持Vue3.0 npm i vue-codemirror@4.x --save// codemirror 需要与 vue-codemirror 同时安装…

JavaScript_语法--变量

1.4 变量 变量:一小块存储数据的内存空间 Java语言是强类型语言,而JavaScript是弱类型的语言 强类型: 在开辟变量存储空间时,定义了空间将来存储的数据的数据类型。只能存储固定类型的数据 弱类型: 在开辟变量存储空间…

Ollama教程——兼容OpenAI API:高效利用兼容OpenAI的API进行AI项目开发

相关文章: Ollama教程——入门:开启本地大型语言模型开发之旅 Ollama教程——模型:如何将模型高效导入到ollama框架 Ollama教程——兼容OpenAI API:高效利用兼容OpenAI的API进行AI项目开发 Ollama教程——兼容OpenAI API:高效利用…

我为什么选择成为程序员?

前言: 我选择成为程序员不是兴趣所在,也不是为了职业发展,全是生活所迫! 第一章:那年,我双手插兜,对外面的世界一无所知 时间回到2009年,时间过得真快啊,一下就是15年前…

基于小程序实现的校园失物招领系统

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:spring…

加固系统安全,防范ssh暴力破解之Fail2Ban

你是否还在担心你的服务器被攻击?你是否还在担心你的博客的安全?你是否还在担心你的隐私?别急fail2ban它来了,它可以解决你的一切问题。 Fail2Ban 是什么? 现在让我们一起来认识一下今天的主角 – Fail2Ban。简单说来…

多级菜单Mysql数据库表设计与创建

1.还是以Vue实现学院官网为例 文章地址:http://t.csdnimg.cn/jrJhE Vue 实现学院官网“菜单”当时是使用静态数据,也就是在页面上写死了的。 今天我们需要将“菜单”数据在数据库中进行维护,我们使用的是Mysql数据库 2.数据库的设计 我们的…