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 并发用户…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...