MySQL-InnoDB数据存储结构
1、存储结构-页
索引结构提供了高效的索引方式,索引信息以及数据记录都保存在数据文件或索引文件中(本质存储在页结构中)
1.1、磁盘与内存交互的基本单位:页
- 在InnoDB中将数据划分为若干页,页的默认大小为:
16KB。 - 不论读多少条数据,都是将这些数据所在的页进行加载。
磁盘I/O操作最小单位是页。
1.2、页的结构
- 相关数据页可以不在物理结构上相连,通过双向链表相关联。
- 每个数据页中的数据记录会按照主键值的大小进行排序,组成一个单向链表
- 每个数据页都会为存储的数据记录生成一个目录页,通过主键值查找是可以在目录页通过二分法快速定位相关数据记录
1.3、页的大小
- 通过查找 innodb_page_size参数获取和设置
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+
1 row in set (2.89 sec)
1.4、页的上层结构

- 区:是比页大一级的存储结构(
默认1MB),在InnoDB存储结构中,一个区会分配64个连续的页。 - 段:由一个或多个区组成,区在文件系统是一个连续分配的空间,并不要求区和区之间是相邻的。段是
数据库中的分配单位,不同类型的数据库对象以不同的段形式存在。创建表时会创建一个表段,创建索引时会创建一个索引段 - 表空间:是一个逻辑容器,存储的对象是段,在一个表空间中可以有一个或者多个段,一个段只能属于一个表空间。数据库由一个或多个表空间组成,表空间从管理上可以划分为:系统表空间,用户表空间,撤销表空间,临时表空间等
2、页的内部结构
| 名称 | 占用大小 | 说明 |
|---|---|---|
| 文件头 | 38字节 | 描述页的信息 |
| 页面头部 | 56字节 | 页的状态信息 |
| 最大(小)用户 | 26字节 | 为两个虚拟的行记录 |
| 用户记录 | 不确定 | 存储行记录内容 |
| 空闲空间 | 不确定 | 页中还没有被使用的空间 |
| 页目录 | 不确定 | 存储用户记录的相对位置 |
| 文件尾 | 8字节 | 校验页是否完整 |
2.1、文件头(File Header)
- 文件头存储了一些全局性的信息,如文件版本、页大小、文件ID等。
- 文件头的大小通常是固定的,对于InnoDB的页,文件头大小是固定的38字节。
- 文件头位于每个数据文件的开头,用于标识文件的类型和属性。
- 主要划分为以下结构:
-
FIL_PAGE_SPACE_OR_CHKSUM(页的校验和):4字节,用于对页的内容进行校验,以确保数据完整性和防止损坏。
-
FIL_PAGE_OFFSET(页号):4字节,每个页都有一个唯一的页号,InnoDB通过页号可以定位到具体的页。
-
FIL_PAGE_PREV(上一个页的页号):4字节,指示上一个页的页号,保证了页之间的逻辑连续性。
-
FIL_PAGE_NEXT(下一个页的页号):4字节,指示下一个页的页号,同样保证了页之间的逻辑连续性。
-
FIL_PAGE_LSN(页面最后被修改的日志序列位置):8字节,记录了页面最后一次被修改时的日志序列位置(LSN)。
-
FIL_PAGE_TYPE(该页的类型):2字节,指示该页的类型,可能包括数据页、索引页等。
-
FIL_PAGE_FILE_FLUSH_LSN(独立表空间中都是0):8字节,用于记录独立表空间中的文件刷新LSN,对于非独立表空间该字段可能有其他用途。
-
FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID(页属于哪个表空间):4字节,用于指示页属于哪个表空间。
-
2.2、用户记录(User Records)
- 实际存储在页中的数据和索引条目。
- 这些记录按照B+树的结构组织在页中,叶子节点存储数据记录,非叶子节点存储索引记录。
- 记录可以是固定长度或变长,根据存储的数据类型和大小而定。
- 主要划分为以下结构:
- delete_mask: 1字节, 标记该记录是否被删除,
- 0 表示记录没有删除,
- 1 表示记录被删除了
- min_rec_mask :1字节, B+数的每非叶子节点中的最小纪录数都会添加该标记
- 只有最小纪录数的min_rec_mask 值为1
- 其他别的记录min_rec_mask 值为0
- n_owned: 4字节,如果当前记录是组内最大记录,则代表槽内的记录数
- heap_no :13字节 当前记录在本页中的位置信息
- 最小记录的heap_no值:0
- 最大记录的heap_no值:1
- record_type: 3字节, 表示当前记录的类型
- 0表示普通记录
- 1表示B+树非叶子节点记录
- 2表示最小记录
- 3表示最大记录
- next_record 16字节 表示从当前记录的真实数据到下一条记录的真实数据的地址偏移量。
- delete_mask: 1字节, 标记该记录是否被删除,
2.3、最大(小)记录
- 由5字节大小的记录投信息和8个字节大小的一个固定的部分组成
- 本页中主键值最小的用户记录的下一条记录就是Infimum记录(也就是最小记录)
- 本页中主键值最大的用户记录的下一条记录就是Supremum记录a(也就是最大记录)。
2.4、空闲空间(Free Space)
- 空闲空间是页中未被使用的部分,用于存储新的数据和索引。
- 当页中的自由空间不足时,InnoDB会进行页分裂操作,将页分成两个更小的页,以便腾出更多的空间。
2.5、页目录(Page Directory)
- 页目录记录了页中数据和索引的偏移量及长度信息,以便InnoDB能够快速地定位和访问这些数据和索引。
- 页目录是由多个槽(Slot)组成的数组,每个槽存储一个记录的偏移量和长度信息。
- 页目录通常位于页头之后,占据了页的一部分空间
- 所以在一个页中根据主键查找记录是很快的,步骤为两步:
- 二分法确定该记录所在的槽,并找到该槽所在分组中主键值最小的那条记录。
- 通过记录的 next_record 属性遍历该槽所在的组中的各个记录
2.6、页面头部(Page Header)
- 记录数量(Number of Records):记录了本页中已经存储的记录数量。
- 第一条记录的地址(Address of First Record):记录了本页中第一条记录的地址或偏移量,以便快速定位到第一条记录。
- 页目录中槽的数量(Number of Slots in Page Directory):记录了页目录中存储的槽的数量,即页目录中有多少个条目。
- 页目录起始地址(Address of Page Directory):记录了页目录的起始地址或偏移量,以便快速定位到页目录。
- 其他状态信息(Other Status Information):可能还包括其他与页相关的状态信息,如空闲空间大小、最大记录偏移量等。
- 通常包含以下信息:
| 名称 | 占用空间大小 | 描述 |
|---|---|---|
| PAGE_N_DIR_SLOTS | 2字节 | 页目录中的槽数量 |
| PAGE_HEAP_TOP | 2字节 | 还未使用的空间最小地址,该地址之后就是 Free Space |
| PAGE_N_HEAP | 2字节 | 本页中的记录的数量(包括最大最小和标记为删除的记录) |
| PAGE_FREE | 2字节 | 指向可重用空间的地址 |
| PAGE_GARBAGE | 2字节 | 已删除记录占用的字节数 |
| PAGE_LAST_INSERT | 2字节 | 最后插入记录的位置 |
| PAGE_DIRECTION | 2字节 | 最后插入的方向 |
| PAGE_N_DIRECTION | 2字节 | 一个方向连续插入的记录数量 |
| PAGE_N_RECS | 2字节 | 该页中记录的数量(不包括最大最小和标记为删除的记录) |
| PAGE_MAX_TRX_ID | 2字节 | 修改当前页的最大事务ID,该值仅在二级索引中定义 |
| PAGE_LEVEL | 2字节 | 当前页在索引树(B+树)中的层级 |
| PAGE_INDEX_ID | 8字节 | 索引ID,表示当前页属于哪个索引 |
| PAGE_BTR_SEG_LEAF | 10字节 | B+树叶子段的头部信息,仅在B+树的Root页定义 |
| PAGE_BTR_SEG_TOP | 10字节 | B+树叶子段的头部信息,仅在B+树的Root页定义 |
2.7 文件尾(File Trailer)
- 文件尾是文件的结束部分,通常用于存储一些结束标识或校验信息。
- 文件尾的大小通常是固定的,对于InnoDB的数据文件,文件尾大小是8字节。
- 通常划分为以下结构:
- 前4个字节代表页的校验和,这个部分和 File Header 中的校验和相对应
- 后4个字节代表页面被最后修改时对应的日志序列位置(LSN),这个部分也是为了校验页的完整性的,如果首部和尾部的LSN值校验不成功的话,就说明同步传输过程出现了问题。
3、行格式(记录格式)
3.1 查询InnoDB引擎的默认行格式
- 语法如下:
mysql> show variables like 'innodb_default_row_format';
+---------------------------+---------+
| Variable_name | Value |
+---------------------------+---------+
| innodb_default_row_format | dynamic |
+---------------------------+---------+
1 row in set (0.13 sec)
- 查看已创建表的行格式:
mysql> show table status like 'rqtanc_test'\G
*************************** 1. row ***************************Name: rqtanc_testEngine: InnoDBVersion: 10Row_format: DynamicRows: 0Avg_row_length: 0Data_length: 16384
Max_data_length: 0Index_length: 0Data_free: 0Auto_increment: NULLCreate_time: 2024-04-22 06:24:10Update_time: NULLCheck_time: NULLCollation: utf8mb4_0900_ai_ciChecksum: NULLCreate_options: Comment:
1 row in set (0.00 sec)
3.2、指定行格式
- 创建表时指定行格式:
mysql> create table rqtanc_one(id int not null,col int null) row_format=compact;
- 修改表时指定行格式:
mysql> alter table rqtanc_one row_format = dynamic;
Query OK, 0 rows affected (0.82 sec)
3.3、分类及相关相关详情描述
参考官方文档
4、表空间
参考 MySQL-数据目录
相关文章:
MySQL-InnoDB数据存储结构
1、存储结构-页 索引结构提供了高效的索引方式,索引信息以及数据记录都保存在数据文件或索引文件中(本质存储在页结构中) 1.1、磁盘与内存交互的基本单位:页 在InnoDB中将数据划分为若干页,页的默认大小为ÿ…...
【吊打面试官系列】Java高并发篇 - 什么是 Java Timer 类?如何创建一个有特定时间间隔的任务?
大家好,我是锋哥。今天分享关于 【什么是 Java Timer 类?如何创建一个有特定时间间隔的任务?】面试题,希望对大家有帮助; 什么是 Java Timer 类?如何创建一个有特定时间间隔的任务? java.util.T…...
Spring生命周期深度解析
Spring生命周期深度解析 介绍 Spring是一个开源的Java框架,用于构建企业级应用程序。它提供了一种轻量级的、非侵入式的开发方式,使得开发者可以更加专注于业务逻辑的实现,而不必过多关注底层的技术细节。 在使用Spring框架开发应用程序时…...
基于 Windows 的记事本简单功能开发及部署发布--迭代2.0
基于上篇文章基于 Windows 的记事本简单功能开发-CSDN博客 更新完成以下几个功能点: 1.中心部件更改为栅格布局 2.另存为功能: 打开文本保存框,用户选中文件保存时 得到绝对路径。 判断用户选择路径不为空。 得到用户输入内容。 创建文件对象&…...
Java lambda
forEach 比 for 语句的线程安全要求更严格。 如此语句使用for语句可以,但是forEach却不可以。...
【智能算法】河马优化算法(HO)原理及实现
目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年,MH Amiri受到自然界河马社会行为启发,提出了河马优化算法(Hippopotamus Optimization Algorithm, HO)。 2.算法原理 2.1算法思想 …...
spring基础使用(案例)
基于xml使用: 准备: 1.Dao层(接口): public interface UserDao {public void save(); } 1.1 Dao层(实现类): public class UserDaoIim implements UserDao {Overridepublic vo…...
相同的树LeetCode
100. 相同的树 - 力扣(LeetCode100. 相同的树 - 力扣( 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 /*** Definition…...
Vue中如何抽取部分代码到单独的ts文件
Vue中如何抽取部分代码到单独的ts文件 本文代码基于 简单示例 这段代码,是比较通用的代码,我想抽取成一个ts文件,来供其他地方调用。 const groupData reactive({groupList:[] as Array<GroupV2Response>,current:{} as GroupV2Re…...
山东齐鲁文化名人颜廷利:朱郭有文才,曲高‘菏’寡星光路
山东齐鲁文化名人颜廷利教授表示,朱郭(谐音‘祖国’)有文才,《曲高‘菏’寡》星光路… 山东菏泽歌手朱之文在2011年凭借一首《滚滚长江东逝水》一夜成名, 十多年之后的今天,菏泽市网络红人郭有才靠一首《诺…...
嵌入式学习70-复习(wireshark使用和http协议)
知识零碎: ssize_t 头文件:<sys/types.h> 有符号整型 --------------------------------------------------------------------------------------------------------------------------------- wireshark 1.sudo wireshark 2.选择 any &…...
idea配置MySQL提示
点击sql语句,然后再选择show context actions 然后再选择Inject language or reference 然后再选择MySQL 然后我们会发现sql语句变颜色了 如果表是红色 那么需要我们连接mysql的对于的数据库...
如何利用AI生成答辩PPT?笔灵AI答辩PPT,智能识别关键点
很多快要毕业的同学在做答辩PPT的时候总是感觉毫无思路,一窍不通。但这并不是你们的错,对于平时没接触过相关方面,第一次搞答辩PPT的人来说,这是很正常的一件事。一个好的答辩PPT可以根据以下分为以下几部分来写。 1.研究的背景和…...
速盾:怎么设置cdn加速小程序图片?
小程序是一种基于微信平台的应用程序,为了提升小程序的用户体验,我们可以通过设置CDN(内容分发网络)来加速小程序中的图片加载速度。CDN是一种分布式服务,它将原始服务器的存储内容复制到在全球各地的缓存服务器&#…...
Android bootchart 分析启动性能工具使用
bootchart简介 bootchart 可为整个系统提供所有进程的 CPU 和 I/O 负载细分。该工具不需要重建系统映像,可以用作进入 systrace 之前的快速健全性检查。 1. 板端配置: 在Android 板端启用 bootchart,请运行以下命令: 2. Bootch…...
一键开启,盲盒小程序里的梦幻奇遇
在这个充满惊喜与未知的数字时代,盲盒小程序以其独特的魅力成为了许多人的新宠。只需一键开启,你就能踏入一个充满梦幻奇遇的世界,探索未知的惊喜与乐趣。 盲盒小程序不仅仅是一个简单的购物平台,它更是一个充满神秘与惊喜的宝藏库…...
如何进行并行执行的诊断与调优 —— 《OceanBase 并行执行》系列 6
在诊断并行执行问题时,我们可以从两个主要方面展开分析。首先,从整体系统层面进行考量,比如检查网络是否畅通、磁盘IO是否过载、CPU资源是否已用满;其次,针对具体的SQL语句进行深入剖析,定位问题SQL&#x…...
【Ubuntu系统hgfs共享文件夹不显示问题解决】
问题描述:为了实现本地物理机与虚拟机之间的文件传输,我们通常采用共享文件夹的方式。但是在Vmware虚拟机使用Ubuntu系统的过程中,由于某种特殊或意外原因,Ubuntu系统或发生/mnt/hgfs共享文件夹丢失不显示的问题。以下是本次问题发…...
C++的相关知识集
1、C概述 1 两大编程思想 c语言在c语言的基础上添加了面向对象编程和泛型编程的支持。c继承了c语言高效,简洁,快速和可移植的传统。 2 起源 与c语言一样,c也是在贝尔实验室诞生的,Bjarne Stroustrup(本贾尼斯特劳斯特卢普)在2…...
解决Jmeter报错 :Error generating the report: java.lang.NullPointerException
当我们在使用命令行的方式来执行jmeter 脚本的时候,例如 ./jmeter -n -t /opt/jmeter/script/test.jmx -Juser50 -Jtime100 -l /opt/jmeter/script/restult2.jtl 上面脚本的含义解释如下: -n -t 通过命令行的方式执行脚本test.jmx -Juser50 并发用户…...
OpenClaw 换 “大脑”!DeepSeek V4 默认集成,离线私有 AI 自由
OpenClaw 接入 DeepSeek 模型完整配置教程 一、前置准备 已安装并正常运行 OpenClaw Windows 客户端;OpenClaw 顶部 Gateway 状态保持在线;电脑网络正常,可稳定访问 DeepSeek 开放平台;准备可接收验证码的手机号或微信账号&…...
FlashAttention 反向传播:删掉 O(N²) 的中间结果,怎么还能算对梯度?
FlashAttention 反向传播:删掉 O(N) 的中间结果,怎么还能算对梯度? 之前有人跟我争:FlashAttention 反向传播不存注意力矩阵,那梯度从哪来?你前向传播的时候 Softmax 的分母、分子都扔了,反向传…...
Display Driver Uninstaller (DDU) 终极指南:显卡驱动彻底清理的完整解决方案
Display Driver Uninstaller (DDU) 终极指南:显卡驱动彻底清理的完整解决方案 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/displa…...
Delft3D建模、水动力模拟方法及地表水环境影响评价:岸线绘制与导入、非结构化计算网格生成、水下地形数据处理等前处理操作;水动力与污染物对流扩散模拟的参数设置、边界条件设定及模型率定验证
查看原文>>>https://mp.weixin.qq.com/s/_CiPDK_oXaAGxVfu2qk6ew 前言 本文以地表水数值模拟软件Delft3D 4.03.00操作为主要内容,强调地表水水动力建模、基础资料的获取、边界条件设定、模型率定和验证、数据分析和处理等关键环节。通过对案例模型的实操…...
影刀RPA 从0到1:自动化系统架构收敛与工程化演进总结
影刀RPA 从0到1:自动化系统架构收敛与工程化演进总结 作者:林焱 写到这里。 这个系列其实已经慢慢进入后半段了。 前面聊了很多内容。 包括: 浏览器池 节点集群 Redis 队列 调度系统 容灾恢复 日志监控 性能治理 很多人刚开始接…...
告别Keil!用CLion+STM32CubeMX+OpenOCD打造你的现代化STM32开发环境(保姆级配置流程)
从Keil到CLion:STM32开发环境现代化升级实战指南 嵌入式开发领域正在经历一场工具链的革新浪潮。对于长期使用Keil这类传统IDE的开发者来说,CLion带来的现代化开发体验堪称降维打击——智能代码补全、精准跳转、安全重构,这些在通用软件开发中…...
DETR训练总找不到目标边界?手把手拆解Conditional DETR的cross-attention,教你精准定位
DETR训练中目标边界定位难题的深度解析与Conditional DETR实战指南 当你在训练DETR模型时,是否经常遇到模型在早期阶段难以准确捕捉目标边界的问题?比如大象的鼻子、斑马的蹄子这些关键部位总是模糊不清。这种现象背后隐藏着DETR架构中一个深层次的设计问…...
6. 网络优化方法之 学习率 优化/衰减策略
1. 学习率优化如图:学习率0.01时收敛速度很慢,学习率0.1时收敛速度变快,学习率越大 收敛速度越快; 学习率0.2 即学习率较大是会 来回震荡,学习率0.3 即学习率过大时会发生 梯度爆炸(即远远超出所在范围&…...
2026年局域网考试系统选型对比:优考试助力政企信创与内网安全
在数字政府与信创产业全面推进的当下,政企、事业单位及涉密单位的考试场景,正面临国产化适配、数据安全、灵活部署三重核心要求。既要满足内网环境下的数据安全与物理隔离,又要兼顾部分场景下外网访问的灵活性,传统单一架构考试系…...
AI Newsletter的本质:一种高信噪比的信息过滤与认知校准方法论
1. 项目概述:一份“AI Newsletter”背后的真实工作流与信息筛选逻辑你点开邮箱,看到标题为This AI newsletter is all you need #41的邮件——它没用夸张的“爆炸性突破”“颠覆认知”这类词,也没塞满emoji和感叹号,但你还是点了开…...
