Innodb架构解析

整体架构

通过《面试官:一条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.mzph.cn/news/808666.shtml

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

相关文章

蓝桥杯-【二分】分巧克力,跳石头

代码及解析: #include<bits/stdc.h> using namespace std; int n,k; const int N100010; int h[N],w[N]; bool check(int d){int num0;for(int i0;i<n;i) num (h[i]/d)*(w[i]/d);if(num>k) return true; //够分else return false; //不够分 } in…

Golang教程一(环境搭建,变量,数据类型,数组切片map)

目录 一、环境搭建 1.windows安装 2.linux安装 3.开发工具 二、变量定义与输入输出 1.变量定义 2.全局变量与局部变量 3.定义多个变量 4.常量定义 5.命名规范 6.输出 7.输入 三、基本数据类型 1.整数型 2.浮点型 3.字符型 4.字符串类型 转义字符 多行字符…

深度学习简介

深度学习简介 一、引言&#xff1a;深度学习的兴起 简短介绍深度学习的历史背景 深度学习&#xff0c;作为人工智能领域的一颗冉冉升起的新星&#xff0c;其根源可以追溯到上世纪的感知机学习算法。这种算法模拟人类的神经元行为&#xff0c;是最早期的尝试之一。然而&#x…

OpenLayers6实战,OpenLayers实现鼠标拖拽方式绘制矩形(拖拽方式绘制长方形和正方形)

专栏目录: OpenLayers实战进阶专栏目录 前言 本章介绍使用OpenLayers在地图上实现鼠标拖拽方式绘制矩形(拖拽方式长方形和正方形)。 OpenLayers本身是可以通过鼠标点击多个点的方式来绘制多边形的,当然也包括长方形和正方形,但是这种多边形绘制出来的图形并不是准确的“…

每天学点儿Python(6) -- 列表和枚举

列表是Python中内置的可变序列&#xff0c;类使用C/C中的数组&#xff0c;使用 [ ] 定义列表&#xff0c;列表中的元素与元素之间用英文逗号&#xff08; , &#xff09;分隔&#xff0c; 但是Python中列表可以存储任意类型的数据&#xff0c;且可以混存&#xff08;即类型可以…

Partisia Blockchain 何以落地隐私技术的高能场景应用?

致力于隐私保护、互操作性和可持续创新的 Layer1 区块链新星&#xff0c;Partisia Blockchain 以安全公平标榜&#xff0c;带给加密用户无忧交易的体验环境。对于这样一个融合零知识证明&#xff08;ZK&#xff09;技术和多方计算&#xff08;MPC&#xff09;的全新项目来说&am…

18_SPI通信外设

SPI通信外设 SPI通信外设SPI外设简介SPI框图SPI基本结构主模式全双工连续传输非连续传输 SPI通信外设 SPI外设简介 STM32内部集成了硬件SPI收发电路&#xff0c;可以由硬件自动执行时钟生成、数据收发等功能&#xff0c;减轻CPU的负担 可配置8位/16位数据帧、高位先行/低位先…

wsl 2在windows11上的设置

详细参考&#xff1a;Manual installation steps for older versions of WSL | Microsoft Learn 1.系统组件要打开 分别是&#xff1a;Hyper-V、虚拟机平台、适用于Windows的Linux子系统 2.以管理员方式运行命令行&#xff0c;逐步执行下面的命令 update to WSL 2, you must…

opc ua 环境构建(记录一)

1、准备 Siemens Simatic WinCC v7.5 二、配置 SIMATIC NET与S7-200 SMART 集成以太网口OPC 通信(TIA平台) 硬件: ①S7-200 SMART ②PC 机 ( 集成以太网卡) 软件: ① STEP 7-Micro/WIN SMART V2.1 ② STEP 7 Professional(TIA Portal V13 SP1 Upd 9) ③ SIMATIC NET …

在直播间卖云,云厂商终于“疯了”

图片&#xff5c;电影《疯狂的石头》截图 ©自象限原创 作者丨程心 云厂商们&#xff0c;在直播间打起来了&#xff01; 继阿里云在罗永浩直播间亮相、京东云硬刚友商之后&#xff0c;腾讯云也开始在“直播间”送起了福利。 4月8日&#xff0c;腾讯云发布新一代AIGC存…

记录vite打包并上传到npm

开始 起因&#xff1a;我们单位这个项目用的vitereact使用print打印 开发环境没问题、一到打包时就卡住、所以我就想单独打包成组件在引用看看还有问题么、结果还真可以&#xff01;又是离谱的一天 首先需要把npm的分支切换成官网地址、因为只有官网地址才能登陆npm账号 这里说…

FreeRTOS学习 -- 移植

一、添加FreeRTOS源码 在基础工程中新建一个名为FreeRTOS的文件夹&#xff0c;创建FreeRTOS文件夹以后将FreeRTOS的源码添加到这个文件夹中。 portable 文件夹&#xff0c;只需要保留keil、MemMang 和 RVDS这三个文件夹&#xff0c;其他的都可以删除掉。 移植FreeRTOSConfig…

SimOne协作版正式发布!“云+端”一体化,加速自动驾驶技术迭代!

创新的“云端”一体化方案 让11大于2 两端登录 场景共享 本地算法 云端并发 颠覆传统自动驾驶研发工作方式 加速自动驾驶算法迭代与优化 SimOne协作版正式发布&#xff01; 什么是SimOne协作版&#xff1f; SimOne协作版&#xff0c;一个创新的“云端”一体化产品。 它将…

【数学建模】机器人避障问题

已知&#xff1a; 正方形5的左下顶点坐标 ( 80 , 60 ) (80,60) (80,60)&#xff0c;边长 150 150 150机器人与障碍物的距离至少超过 10 10 10个单位规定机器人的行走路径由直线段和圆弧组成&#xff0c;其中圆弧是机器人转弯路径。机器人不能折线转弯&#xff0c;转弯路径由与…

代码随想录-算法训练营day02【数组02:滑动窗口、螺旋矩阵】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG?uc71ed002e4554fee8c262b2a4a4935d8977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II &#xff0c;总结 建议大家先独立做题&#xff0c;…

基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具

基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具 文章目录 基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具一、软件介绍二、软件功能1、数据输入 2、潮流作业设置3、 潮流结果报表及可视化三、 软件设计思路1 、牛顿拉…

【Vue3语法单文件——自用】

1. Vue3基础语法 <script setup> import { ref,computed } from vue// 定义响应式的变量 const count ref(0) const author ref({name: John Doe,books: [Vue 2 - Advanced Guide,Vue 3 - Basic Guide,Vue 4 - The Mystery] }) //定义props const props defineProps(…

[RK3399 Linux] 移植Linux 5.2.8内核详解

背景是在RK3399上面移植Rockchip官方提供的u-boot 2017.09 一、linux内核 1.1 源码下载 内核源码下载地址为:《https://www.kernel.org/》: 也可以到内核镜像网址下载https://mirrors.edge.kernel.org/pub/linux/kernel/,这里下载速度更快。 如果下载速度太慢,无法下载,…

蓝牙app设计(方案二) E4A (时钟 优缺点)

例程改的! 主界面 虽然上面有搜索功能,但是本人建议先自行配对在使用,这样更好用,把要使用的设备收藏一下更好找哦(这样就是橙色的了,只需要点对应蓝牙左边) 代码修改部分 原版是不停向下滚动显示,这样个人觉得不太好看,所以加了个时钟,到对应时钟周期清空(达到刷…

BGP小实验

光只是知道理论还不行&#xff0c;还是要多动手练练&#xff0c;就练一个bgp实验吧&#xff0c;梳理一下做题思路 实验要求&#xff1a; 大体要求就是&#xff1a;R1的环回可以ping通R2-R5的环回&#xff0c;R5同理 思路&#xff1a; 基础配置&#xff1a; 第一步先把地址环…