【MySQL】InnoDB的存储结构

InnoDB的存储结构:每个表都会生成一个表空间文件,这个文件里面最小结构就是行,存储的真正的数据,一个页来管理若干行,一个区来管理若干页,一个区组来管理若干区。段并不是真正的物理存储结构,它只是把这些数据结构划分成两部分(B+树的叶子节点和非叶子节点)。

真实的数据在表空间是以行的形式存储。

结构

行结构如下图所示:

真实数据部分

主键值:

如果表中定义了主键,就直接存储主键的值。

如果还有复合主键,则按照顺序一块存在主键值中。

如果没有定义主键,优先使用第一个 不为空 且 是 唯一 的字段作为主键。

如果 没有不为空且唯一的字段,就使用DB_ROW_ID作为主键,这个大小为6字节。

DB_TX_ID:

记录 创建或最后一次修改该 行 数据的事务ID。

DB_ROLL_PTR

如果在 事务中这条记录 被修改,这个回滚指针指向上一个版本。

其他数据:

这些非空数据从左往右依次存储。


额外信息

头信息:

  • 下一行偏移量:通过这个把所有的行链接形成一个单向链表。
  • 行类型:
    • 普通数据行
    • 索引目录行
    • 页内最小行(页是组织行的数据结构)
    • 页内最大行
  • 行在页内的位置
  • 目录组内行数:如果该行是组内最后一行,那么这个才有值
  • 非叶子节点最小行标记:如果当前行是索引目录行并且也是B+索引数某层的最小值,那么这个就置为1
  • 删除标记:删除行数据就是改变一下删除标志。
  • 预留信息

Null值列表:

使用位图的思想来存:在可以为空的列中,如果为空,就为1。这样就不用给空列留位置了。

变长字段长度列表: 

记录表中所有可变长度(varchar、varbinary、text、blob) 的 字段的实际长度(字节数)。这样在真实存的时候,就可以把列与列之间划分开来。

不同的字符编码下一个字符所占的字节大小不一样。

可以看到,最大的一个字符占4字节,最小的占1字节。所以2字节最大表示的数值的2^16=65536。65536/4 = 16384。也就是varchar长度的最大值。

当实际字节数 n (字符个数 × 单个字符所占字节) 不超过一个 字节能记录的大小 - 1(128-1=127),就用一个字节来记录。超过一个就用两个。也就是 n > 127 用两个 否则用 1个。

但是读取的时候是如何知道,要读一个字节还是两个呢。

首先先读最高位,如果为1,就在往前读一个字节,就是两个字节来表示长度

如果为0,就是一个字节来表示长度。

当可变类型是text、blob时,直接把这个列放入“溢出页”的独立表空间中,用20个字节来标记其位置。


行格式

上面结构中存储字段的策略就是动态格式(Dynamic)。也是默认选择的。

查看行格式

show variables like "innodb_default_row_format";

show table status in 数据库名\G

设定行格式

# 通过全局变量设置
SET GLOBAL innodb_default_row_format=DYNAMIC;
# 在创建表时明确的指定⾏格式
CREATE TABLE t1 (c1 INT) ROW_FORMAT=DYNAMIC;

冗余格式(Redundant)
已被淘汰,存在仅为了与旧版本 MySQL 兼容,不建议使用,这里不再讨论。

压缩格式(Compressed)
行结构与 DYNAMIC 完全相同,只是会对数据进行压缩,以减少对空间的占用。

紧凑格式(Compact)
在结构上与 DYNAMIC 相同,但在处理超长字段时有所不同。它不会把所有超长数据都放在溢出页中,而是会在本行中保留前768个字节的数据,多出的部分放在溢出页中。溢出页的地址额外使用20个字节表示。因此,在本行的列中会占用768 + 20个字节。


MySQL中的“页”是一个应用层的概念,是MySQL根据自身的应用场景定义的一种数据结构。通常,在操作系统的文件系统中,管理磁盘文件时以4KB大小为一个管理单元,称为“数据块”。但在数据库的应用场景中,查询的数据量通常较大。如果也使用4KB作为最小的数据存储单元,可能会显得太小,同时也会导致频繁的磁盘I/O操作,从而降低效率。因此,MySQL根据自身情况定义了大小为16KB的“页”作为磁盘管理的最小单位

show variables like "innodb_page_size";

修改的化必须得是4KB的整数倍

每次内存与磁盘的交互至少读取一个“页”。因此,在磁盘中,每个“页”内部的地址是连续的。这种设计是根据局部性原理而来:在数据使用过程中,未来可能会使用的数据与当前访问的数据在空间上是临近的。因此,当从磁盘读取一个页的数据放入内存中后,如果下次查询的数据仍在这个页中,就可以直接从内存中读取,从而减少磁盘I/O操作,提高性能。

结构

页是由 页头+若干数据行+页尾构成。

页头

校验和:FIL_PAGE_SPACE_OR_CHKSUM,用于页的完整性校验。

页号:FIL_PAGE_OFFSET 占用 4Byte,相当于 InnoDB 表中最多可以拥有 2^(4*8)-1 约 42 亿个。分别是1,2,3…依此类推,按照每页16KB 大小计算,一个表空间最大容量为 2^(4*8) * 16KB = 64TB,这也是 InnoDB 表空间最大容量是 64TB 的原因。

上一个页页号:FIL_PAGE_PREV
下一个页页号:FIL_PAGE_NEXT  多个页通过这两个信息组成双向链表,即使不同的页地址不连续,也可以通过链表连接。

表空间ID:FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID,当前页属于哪个表空间。

页类型:FIL_PAGE_TYPE,数据页对应的页类型是 FIL_PAGE_INDEX = 0x45BF。

最近一次修改的LSN:FIL_PAGE_LSN,占用 8Byte。

LSN(Log Sequence Number)是“日志序列号”的缩写,表示日志中记录的操作对应的时间点,使用一个任意的、不断增加的值来表示。LSN使用8字节的无符号长整型表示。

已被刷到磁盘的LSN:FIL_PAGE_FILE_FLUSH_LSN,占用 8Byte。

页尾

最近一次修改的LSN:与页头中的意义相同

校验和:与页头中的意义相同 


页的初始化

当创建表的时候,不知道表的数量级,所以为了节省空间,刚开始只创建 7个初始页(MySQL5.7是6个)

select * frominformation_schema.INNODB_TABLESPACES where name = '数据库/数据表'\G

这些零散的页会放在表空间中的碎片区,当碎片区达到32个页之后,后续如果还要申请空间,就会申请32个页,这32个页就是区,用来管理页的数据结构。


管理页的数据结构就是区。

结构

一个区管理32个页,刚好1M。

使用区的原因

  • 在一个区中,如果是相邻页,磁盘是顺序I/O的,这样读取会很快。
  • 在一个区中,如果不是相邻页,可以大幅减少磁头移动,读取也是较快。
  • 在不同区中,无法提升读取速度。所以要使用区组。
  • 如果频繁访问某个区中的页,可以把整个区都取出来放到内存中,减少后续可能的读取操作。

区组

区组是管理区的数据结构。

结构

一个区组管理256个区,其中第一个区组存的信息和其他的略有不同。

第一个区组

第一个区组中的第一个区的前四页比较特殊,也就是页初始化时候的前四页。

  • File Space Header(文件空间头):这一页存储了关于表空间和区组中各个区的元数据信息。它记录了表空间的状态、大小、分配情况以及每个区的使用信息。这对于InnoDB来说是管理磁盘空间和执行一些管理操作非常重要的信息。
  • Insert Buffer Bitmap(插入缓冲位图):插入缓冲是InnoDB用来加速对辅助索引的更新操作的一种机制。这个页存储了与插入缓冲相关的位图信息,用于跟踪哪些页在插入缓冲中。这有助于优化并发插入操作的性能(change buffer区域相关)。
  • File Segment inode(文件段inode):段inode页记录了关于InnoDB文件段(通常是表空间文件)的详细信息,包括段的位置、大小和其他管理信息。这些信息对于InnoDB存储引擎的存储和管理操作至关重要。
  • B-tree Node(B树节点):这个页存储了InnoDB中各种B+树索引的根节点信息。根节点是索引结构的起始点,包含了指向整个B+树的其它节点和叶子节点的指针。这使得InnoDB能够高效地查找和操作索引数据

其他闲置的页用来存放真实的数据。

其他的区组

其他区组的第一个区的前两个页都是一样的。

  • Extent Descriptor(XDES):区组条目信息:记录每个区的偏移并用双向链表连接
  • Insert Buffer Bitmap

其他闲置的页用来存放真实的数据。


上面的 行、页、区和区组都是物理结构来存储数据的,而段并非是物理结构的存储。段的主要作用是区分不同功能的区以及在碎片区中的页。主要分为两类:叶子节点段和非叶子节点段,这两个段对应于B+树索引结构中的叶子和非叶子节点。

表空间

表空间可以理解为MySQL为了管理数据而设计的一种数据结构,主要描述了数据结构的定义。表空间文件是这一定义的具体实现,以文件的形式存在于磁盘上。

表空间文件是用来存储表中数据的文件,其大小取决于存储的数据量。在MySQL中,表空间分为五类:

  1. 系统表空间
  2. 独立表空间
  3. 通用表空间
  4. 临时表空间
  5. 撤销表空间

每种表空间类型用于不同的数据存储和管理目的,在MySQL的数据库架构中,它们各自承担着特定的角色和功能。

当使用InnoDB存储引擎创建一个表时,默认会在数据目录对应的数据库子目录中生成相应的表空间文件,以 `.ibd` 为文件的后缀,用来存储数据和索引。如果每个表都对应一个表空间文件,这称为独立表空间。在MySQL 5.7及以后的版本中,默认每个表都会生成独立表空间。可以通过系统变量 `innodb_file_per_table` 控制这一行为。当这个选项被关闭时,所有表的数据将存储在系统表空间中。 

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

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

相关文章

汇总大语言模型LLM的评测基准数据集(BenchMarks)

文章目录 0. 引言1. 知识与语言理解1.1 MMLU1.2 ARC1.3 GLUE1.4 Natural Questions1.5 LAMBADA1.5 HellaSwag1.6 MultiNLI1.7 SuperGLUE1.8 TriviaQA1.9 WinoGrande1.10 SciQ 2. 推理能力2.1 GSM8K2.2 DROP2.3 CRASS2.4 RACE2.5 BBH2.6 AGIEval2.7 BoolQ 3. 多轮开放式对话3.1 …

vue3中获取Excel和csv文件中的内容

1.效果 2.安装 npm install xlsxyarn add xlsx 3.引入使用 <el-upload ref"uploadRef" :on-change"changeFile" :show-file-list"false" class"mr10" accept".csv, .xlsx, .xls"action"#" :auto-upload&quo…

滚动表格(vue版本)【已验证可正常运行】

演示图 注&#xff1a;以下代码来自于GPT4o&#xff1a;国内官方直连GPT4o 代码 <template><div><div class"alarmList-child" ref"alarmList" mouseenter.stop"autoRoll(1)" mouseleave.stop"autoRoll()"><div…

基于DPU的Ceph存储解决方案

1. 方案背景和挑战 Ceph是一个高度可扩展、高性能的开源分布式存储系统&#xff0c;设计用于提供优秀的对象存储、块存储和文件存储服务。它的几个核心特点是&#xff1a; 弹性扩展&#xff1a;Ceph能够无缝地水平扩展存储容量和性能&#xff0c;只需添加新的存储节点即可&am…

【AUTOSAR 基础软件】DEM模块详解(诊断故障管理)

文章包含了AUTOSAR基础软件&#xff08;BSW&#xff09;中DEM模块相关的内容详解。本文从ISO标准&#xff0c;AUTOSAR规范解析&#xff0c;ISOLAR-AB配置以及模块相关代码分析四个维度来帮读者清晰的认识和了解DEM这一基础软件模块。文中涉及的ISOLAR-AB配置以及模块相关代码都…

查询DBA_TEMP_FILES报错,删除临时表空间报错ORA-60100

SYMPTOMS 查询DBA_TEMP_FILES报错如下图 ORA-01157: cannotidentify/ock data fle 201 -see DBWR trace fle ORA-01110: data fle 20 1: D:APPADMINISTRATORIORADATA MARTIDATAFILE 01157,00000-"cannotidentify/ock data fle %s -see DBWR trace fle"*Cause: The b…

2024年湖北省安全员-C证证考试题库及湖北省安全员-C证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年湖北省安全员-C证证考试题库及湖北省安全员-C证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试…

云计算:重塑数字时代的基石

目录 一、引言 二、云计算的定义与特点 三、云计算的发展历程 四、云计算的应用场景 五、云计算面临的挑战 六、云计算的未来发展趋势 七、结语 一、引言 随着信息技术的飞速发展&#xff0c;云计算已经逐渐渗透到我们生活的方方面面。从个人用户的在线存储、在线办公&…

应用案例 | 如何监测高价值货物在物流运输过程中受到的振动和冲击?全面保障货物安全

一、货物运输 不同种类的货物对运输的要求不同&#xff0c;钢铁、煤炭、矿石等大宗物资通常对运输要求较低&#xff0c;而电子产品、IT 产品、家电等高价值敏感类货物则更强调运输的安全性和时效性&#xff0c;往往希望能尽可能安全和快速送达这类货物&#xff0c;使之尽快进入…

laravel对接百度智能云 实现智能机器人

创建API Key和 Secret Key进入网址&#xff1a;百度智能云千帆大模型平台 如下图操作&#xff1a; 填写完毕点击确认后&#xff0c;即可得到sk和ak 后端接口实现代码&#xff1a; //调用百度智能云第三方机器人接口public function run($text) {$curl curl_init();curl_setop…

阿一网络安全培训中心专门为你准备了一份WScan使用教程

下载地址&#xff1a;https://github.com/chushuai/wscan/releases 版本的选择 Windows就选windows_amd64 Linux就选linux_amd64 mac就选darwin_amd64 下载好后&#xff0c;运行一次exe会生成一个config.yaml文件 把该文件中plugins下面的所有插件的enabled设置为True。&…

数据库使用笔记

1.mysql数据库频繁访问导致连接超时 解决办法一&#xff1a; 优化查询&#xff1a;检查并优化SQL查询语句&#xff0c;减少不必要的数据库调用。增加连接池大小&#xff1a;如果应用程序使用连接池&#xff0c;可以考虑增加连接池的最大连接数。&#xff08;注&#xff1a;不能…

Nginx网站服务详解(设置并发数、实现不同虚拟主机等)

一、nginx的最大并发数设置已经状态收集模块 [root192 nginx]# cat nginx.conf # For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/user ngin…

单源最短路径问题(Dijstra)

#include<iostream> using namespace std; #define MAX 500 #define INT 999 typedef struct {char vex[MAX];int Edge[MAX][MAX];int vexnum,arcnum; }MGraph; void InitMG(MGraph &MG) {cout<<"输入顶点数和边数&#xff1a;";cin>>MG.vexnu…

SOBEL图像边缘检测器的设计

本项目使用FPGA设计出SOBEL图像边缘检测器&#xff0c;通过分析项目在使用过程中的工作原理和相关软硬件设计进行分析详细介绍SOBEL图像边缘检测器的设计。 资料获取可联系wechat 号&#xff1a;comprehensivable 边缘可定义为图像中灰度发生急剧变化的区域边界,它是图像最基本…

linux中find命令和exec的强大组合用法

如何将 find 命令与 exec 一起使用 Find 是一个已经非常强大的命令&#xff0c;用于根据许多条件搜索文件。exec 命令使您能够处理 find 命令的结果。 我在这里分享的例子只是一瞥。find-exec 命令组合在一起为您提供了在 Linux 命令行中执行操作的无限可能。 find 和 exec 命令…

Llama 3 模型微调的步骤

环境准备 操作系统&#xff1a;Ubuntu 22.04.5 LTS Anaconda3&#xff1a;Miniconda3-latest-Linux-x86_64 GPU&#xff1a; NVIDIA GeForce RTX 4090 24GStep 1. 准备conda环境 创建一个新的conda环境&#xff1a; conda create --name llama_factory python3.11激活刚刚创…

[每周一更]-(第103期):GIT初始化子模块

文章目录 初始化和更新所有子模块分步骤操作1. 克隆包含子模块的仓库2. 初始化子模块3. 更新子模块 查看子模块状态提交子模块的更改处理子模块路径错误的问题 该问题的缘由是因为&#xff1a;在写某些代码的时候&#xff0c;仓库中有些文件夹&#xff0c;只提交了文件夹名称到…

使用 Ubuntu x86_64 平台交叉编译适用于 Linux aarch64(arm64) 平台的 QT5(包含OpenGL/WebEngine支持) 库

使用 Ubuntu AMD64 平台交叉编译适用于 Linux ARM64 平台的 QT5(包含 OpenGL/WebEngine 支持) 库 目录 使用 Ubuntu AMD64 平台交叉编译适用于 Linux ARM64 平台的 QT5(包含 OpenGL/WebEngine 支持) 库写在前面前期准备编译全流程1. 环境搭建2. 复制源码包并解压&#xff0c;创…

在Mac上恢复丢失或未保存的Word文档的5种有效方法

“救命&#xff01;我想在Mac上恢复丢失的Word文档。就在 1 小时前&#xff0c;我错误地删除了它们&#xff0c;并清空了垃圾桶。这些Word文档对我来说非常重要。我不知道如何恢复它们&#xff0c;谁能帮我&#xff1f;提前致谢&#xff01; 没有什么比忘记保存 Word 文档或在…