【MySQL篇】行格式详解
MySQL行格式详解
文章目录
- MySQL行格式详解
- 🎉 什么是行格式
- 🐱👤 如何查看行格式
- 🐱🚀 InnoDB 行格式有哪些?
- 🐱🏍 Compact 行格式
- 🚩 额外信息
- 🚀 变长字段长度列表
- 🚓 Null值列表
- 🚁 记录头
- 🌌 真实数据
- 🌍 隐藏字段
- 🗻 存储的真正字段
🎉 什么是行格式
首先我们得明确一点,行格式是存在页中的,数据页中存储的行格式是数据行(也就是实际数据),目录页存的是目录项记录【非叶子节点行】(存储页号和主键)
🐱👤 如何查看行格式
-- 创建数据表时,显示指定行格式
CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称;-- 创建数据表时,修改行格式
ALTER TABLE 表名 ROW_FORMAT=行格式名称;-- 查询数据表信息
show table status from 数据库名 like '<数据表名>';
-- 指定行格式
create table task2
(idx int auto_increment,primary key (idx)
) row_format = compact;-- 查看行格式
show table status from test1 like 'task2';
可以看到下图 Row_format 字段种就是行格式

🐱🚀 InnoDB 行格式有哪些?
InnoDB提供了四种行格式,分别是Redundant、Compact、Dynamic和 Compressed
| 特性/格式 | Redundant | Compact | Dynamic | Compressed |
|---|---|---|---|---|
| 存储效率 | 最低,存在冗余 | 中等,行头较小,适合常规数据 | 高效,特别是对于大字段的存储 | 极高,适用于大规模压缩,节省磁盘空间 |
| 适合场景 | 旧版本兼容,较小数据表 | 默认格式,常规数据库 | 适合大字段存储和需要高压缩的场景 | 大量数据表,磁盘空间有限,压缩需求高 |
| 行头大小 | 较大,包含多余的标记和指针 | 较小,更紧凑的存储结构 | 较大,包含更多字段指针和溢出页信息 | 行头较大,压缩后存储空间利用较高 |
| 大字段存储 | 存储在行内或溢出页 | 存储在行内或溢出页 | 存储在外部溢出页,仅保存指针 | 存储在溢出页,且经过压缩处理 |
| 压缩支持 | 不支持压缩 | 不支持压缩 | 不支持压缩 | 支持压缩,数据写入时自动压缩 |
| 性能 | 较低,冗余存储带来性能损失 | 性能平衡,适合一般负载 | 性能较好,适合大字段,处理复杂数据表 | 性能较低,解压缩开销较大 |
| 兼容性 | 主要用于早期 MySQL 版本 | MySQL 5.0 之后推荐的默认行格式 | MySQL 5.0 之后推荐的格式 | 用于对存储空间要求高的数据库 |
- Redundant:不再推荐使用,主要用于与早期版本的兼容。
- Compact:适用于常规数据存储,提供较好的性能和存储效率,是大多数情况下的默认行格式。
- Dynamic:适合大字段、可变长度字段,特别是存储
TEXT和BLOB等类型的数据,能够有效提高存储效率。 - Compressed:适用于对存储空间有较高需求,尤其是存储大量数据时,能够显著减少磁盘使用,但可能会引入 CPU 开销。
下面我们主要介绍一下 Compact 行格式
🐱🏍 Compact 行格式
如下图是 Compact 行格式的一个图解

Compact 行格式主要分为几个部分
🚩 额外信息
🚀 变长字段长度列表
变长字段长度列表主要是记录变长字段 varchar 所占的长度大小,举个例子,有如下表
CREATE TABLE `t_user` (`id` int(11) NOT NULL,`name` VARCHAR(20) DEFAULT NULL,`phone` VARCHAR(20) DEFAULT NULL,`age` int(11) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
DEFAULT CHARACTER SET = ascii ROW_FORMAT = COMPACT;
当有一条记录是(1,“a”,“123”,18)的时候,由于使用的是 ASCII 字符集
- name 占 6 个字节,转换成 16 进制就是 0x06
- phone占 3 个字节,转换成 16 进制就是0x03
- age 列和 id 列不是变长字段
这些变长字段的真实数据占用的字节数会按照列的顺序逆序存放(能够提高cpu的cache命中率),那这一条记录变长字段长度列表存储的值就是 03 06,如图所示

为什么要逆序存放?
答:
- 记录头信息中,指向下一条记录的指针,指向的是记录头信息和真实数据的中间位置,这样可以往左读就是记录头信息,右就是真实数据,比较方便
- 使得靠前的变长字段长度列表和真实数据可以尽量在同一个cpu的cache行中,提高cache的命中率
当表没有变长字段的时候,那么变长字段长度列表就不存在于行格式
🚓 Null值列表
通常情况下 NULL 值列表大小是 1 字节,也就是 8 bit,每个 bit 位表示一个字段
- 二进制位的值为
1时,代表该列的值为NULL。 - 二进制位的值为
0时,代表该列的值不为NULL。
Null值列表对应的列也是按照逆序对应,如下图

举个例子,假设现在我有一条记录(1,“a”,“123”,null), id 有 NOTNULL 约束,所以不参与到 null值列表中来;name不为null,所以对应的是0;同理,phone对应的也是0;age字段为null,所以对应的是1;所以字段的顺序对应的null值列表是001,因为要逆序存放,所以最终空值列表是100
- 当表中所有字段都有
NOT NULL约束时,那么就不存在 NULL 值列表 - 当表中可以为 NULL 的字段大于 8 个,也就是8 bit不足以存下 Null 值列表的时候, Null 值列表就会扩展到 2 字节(8 bit),以此类推
🚁 记录头
如下图

- delete_mark:行删除标记,在 innodb 中对于行数据的删除并不会马上去刷盘,而是先打上一个标记,待后续刷盘时机到了再把脏页刷入
- min_rec_mark:B+树每层非叶子节点中最小的目录项记录会添加该标记(也就是目录页中主键值最小的记录的min_rec_mark是1,其他是0)。
- record_type:记录类型,0 代表普通记录(记录数据),1 代表非叶子结点页中的记录(目录项记录),2 代表最小记录,3 代表最大记录。
- n_owned:一个页有多条记录,这些记录会再进行分组(一个分组对应一个页的槽位),每个分组有一条记录会存储该分组有多少条数据,这个字段就是用来标记该分组有多少条记录的。
- heap_no:当前记录在页中相对位置。
- next_record:指向下一条记录的指针,这里可以对应到 B+树的结构特点。
🌌 真实数据

上图是 compact 行格式中记录的真实信息除了几个列值外,还有三个隐藏字段
🌍 隐藏字段
- row_id:如果建表时指定了主键或者唯一约束,如果没有指定,那么 InnoDB 就会为记录添加 row_id 隐藏字段作为聚簇索引的键。,row_id 不是必须的
- trx_id:事务id,表示这个数据是由哪个事务生成的,trx_id是必需的
- roll_ptr:这条记录上一个版本的指针。roll_pointer 是必需的
🗻 存储的真正字段
按照顺序排放,null值字段被省略。
相关文章:
【MySQL篇】行格式详解
MySQL行格式详解 文章目录 MySQL行格式详解🎉 什么是行格式🐱👤 如何查看行格式🐱🚀 InnoDB 行格式有哪些?🐱🏍 Compact 行格式🚩 额外信息🚀 变长字段…...
嵌入式知识点总结 操作系统 专题提升(五)-内存
针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。 目录 1.在1G内存的计算机能否malloc(1.2G)?为什么? 2.malloc能申请多大的空间? 3.内存管理有哪几种方式? 4.什…...
动手学深度学习---深层神经网络
目录 一、神经网络1.1、模型训练1.2、损失函数1.2.1、分类:hinge loss/合页损失/支持向量机损失1.2.2、分类:交叉熵损失(softmax分类器)1.2.2.1 二分类交叉熵损失1.2.2.2 多分类交叉熵损失 1.2.3、回归:误差平方和(SSE)…...
第9章 城市基础设施更新工程 9.1 道路改造施工
9.1 道路改造施工 9.1.1 道路改造施工内容 沥青、水泥混凝土、砌块路面及人行步道、绿化照明、附属设施、交通标志。沥青路面材料的再生利用。 9.1.2 道路改造施工技术 1.沥青路面病害及微表处理 1.病害处理 裂缝处理 10mm以内 专用灌缝材料、热沥青灌缝、缝内潮湿时采用…...
java基础6(黑马)
一、static 1.static修饰成员变量 static:叫静态,可以修饰成员变量、成员方法。 成员变量按照有无static,分两种。 类变量:有static修饰,属于类,在计算机中只有一份,会被类的全部对象共享。…...
Transformer 详解:了解 GPT、BERT 和 T5 背后的模型
目录 什么是 Transformer? Transformer如何工作? Transformer 为何有用? 常见问题解答:机器学习中的 Transformer 在技术领域,突破通常来自于修复损坏的东西。制造第一架飞机的人研究过鸟类。莱特兄弟观察了秃鹫如何在气流中保持平衡,意识到稳定性比动力更重要。…...
Ollama命令使用指南
Ollama 命令使用指南 Ollama 命令使用指南1. Ollama 命令概览2. Ollama 命令详解2.1 启动 Ollama2.2 创建模型2.3 查看模型信息2.4 运行模型2.5 停止运行的模型2.6 从注册表拉取模型2.7 推送模型到注册表2.8 列出本地模型2.9 查看正在运行的模型2.10 复制模型2.11 删除模型 3. …...
【Prometheus】MySQL主从搭建,以及如何通过prometheus监控MySQL运行状态
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
上传文件防木马函数
项目环境:TP6、TP5 问题:解决旧项目中上传上来的文件校验不严格。导致会有木马文件入侵的情况发生。除了上篇博文中提及的限制上传文件存储的目录不可执行php文件外。仍需在入口处严格检验上传文件的类型,排除php类可执行文件上传。 解决&a…...
百问网imx6ullpro调试记录(linux+qt)
调试记录 文章目录 调试记录进展1.开发板相关1.1百问网乌班图密码 1.2 换设备开发环境搭建串口调试网络互通nfs文件系统挂载 1.3网络问题1.4系统启动1.5进程操作 2.QT2.1tslib1.获取源码2.安装依赖文件3.编译 2.2qt移植1.获取qt源码2.配置编译器3.编译 2.3拷贝到开发板1.拷贝2.…...
人脸识别与人脸检测技术
人脸识别技术,作为一种基于人的脸部特征信息进行身份识别的生物识别技术,近年来在人工智能和计算机视觉技术的推动下取得了显著进展。它利用摄像机或摄像头采集含有人脸的图像或视频流,自动在图像中检测和跟踪人脸,进而对检测到的人脸进行一系列计算和分别判断。这一技术不…...
前端性能分析常见内容
前端性能分析是前端开发中的重要部分,以下是对前端常考性能分析题目的详解: 一、性能指标 前端性能优化的核心目标是提升用户体验,常见的性能指标包括: 加载时间(Load Time):指从用户发出请求…...
ZEMAX POPD操作数
在Zemax中,POPD(Physical Optics Propagation Data) 是一个用于物理光学传播(POP)分析的关键操作数,主要用于优化或分析光束的物理特性(如束腰、发散角、M因子等)。以下是对其使用方…...
ansible使用学习
一、查询手册 1、官网 ansible官网地址:https://docs.ansible.com 模块查看路径:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html#plugins-in-ansible-builtin 2、命令 ansible-doc -s command二、相关脚本 1、服务…...
VS2022中cmath.h头文件功能介绍
在C语言的世界里,数学运算一直是程序开发中不可或缺的一部分。无论是进行简单的数值计算,还是处理复杂的科学工程问题,都需要借助数学函数来实现。在Visual Studio 2022(VS2022)中,cmath.h(在C语…...
基于 PyTorch 的树叶分类任务:从数据准备到模型训练与测试
基于 PyTorch 的树叶分类任务:从数据准备到模型训练与测试 1. 引言 在计算机视觉领域,图像分类是一个经典的任务。本文将详细介绍如何使用 PyTorch 实现一个树叶分类任务。我们将从数据准备开始,逐步构建模型、训练模型,并在测试…...
【STM32系列】利用MATLAB配合ARM-DSP库设计IIR数字滤波器(保姆级教程)
ps.源码放在最后面 设计FIR数字滤波器可以看这里:利用MATLAB配合ARM-DSP库设计FIR数字滤波器(保姆级教程) 设计IIR滤波器 MATLAB配置 设计步骤 首先在命令行窗口输入"filterDesigner",接着就会跳出以下界面…...
如何在本地部署deepseek?
1、打开ollama官网,点download(下载需要翻墙 https://ollama.com/ 2、双击下载好的OllamaSetup.exe,一直点下一步即可。 3、winR 输入cmd,打开命令提示符,输入ollama。有以下提示即安装完成。 4、可以根据 nvidia-…...
AJAX项目——数据管理平台
黑马程序员视频地址: 黑马程序员——数据管理平台 前言 功能: 1.登录和权限判断 2.查看文章内容列表(筛选,分页) 3.编辑文章(数据回显) 4.删除文章 5.发布文章(图片上传࿰…...
MarsCode AI插件在IntelliJ IDEA中使用
文章目录 前言一、MarsCode是什么?二、下载三、使用1、登录2、操作界面3、生成代码4、解释代码5、注释代码6、生成单测7、智能修复8、代码补全 总结 前言 随着 AI 技术浪潮席卷而来,各类 AI 工具呈爆发式涌现,深度融入我们的日常与职场&…...
如何将网站提交百度收录完整SEO教程
百度收录是中文网站获取流量的重要渠道。本文以我的网站,www.mnxz.fun(当然现在没啥流量) 为例,详细讲解从提交收录到自动化维护的全流程。 一、百度收录提交方法 1. 验证网站所有权 1、登录百度搜索资源平台 2、选择「用户中心…...
基于 SVPWM 的异步电机直接转矩控制系统的研究与仿真
标题:基于 SVPWM 的异步电机直接转矩控制系统的研究与仿真 内容:1.摘要 摘要:本文主要研究了基于 SVPWM 的异步电机直接转矩控制系统。首先,介绍了异步电机直接转矩控制的基本原理和 SVPWM 技术的特点。然后,详细阐述了系统的设计方法&#…...
C# OpenCV机器视觉:SoftNMS非极大值抑制
嘿,你知道吗?阿强最近可忙啦!他正在处理一个超级棘手的问题呢,就好像在一个混乱的战场里,到处都是乱糟糟的候选框,这些候选框就像一群调皮的小精灵,有的重叠在一起,让阿强头疼不已。…...
生信云服务器:让生物信息学分析更高效、更简单【附带西柚云优惠码】
随着生物信息学的快速发展,基因组测序、单细胞分析等复杂任务逐渐成为研究者们的日常工作。然而,个人电脑在处理这些任务时往往面临性能瓶颈,如内存不足、运算速度慢等问题,导致分析任务频繁失败或崩溃。为了解决这一难题…...
【清晰教程】通过Docker为本地DeepSeek-r1部署WebUI界面
【清晰教程】本地部署DeepSeek-r1模型-CSDN博客 目录 安装Docker 配置&检查 Open WebUI 部署Open WebUI 安装Docker 完成本地DeepSeek-r1的部署后【清晰教程】本地部署DeepSeek-r1模型-CSDN博客,通过Docker为本地DeepSeek-r1部署WebUI界面。 访问Docker官…...
AI知识库和全文检索的区别
1、AI知识库的作用 AI知识库是基于人工智能技术构建的智能系统,能够理解、推理和生成信息。它的核心作用包括: 1.1 语义理解 自然语言处理(NLP):AI知识库能够理解用户查询的语义,而不仅仅是关键词匹配。 …...
Flink-序列化
一、概述 几乎每个Flink作业都必须在其运算符之间交换数据,由于这些记录不仅可以发送到同一JVM中的另一个实例,还可以发送到单独的进程,因此需要先将记录序列化为字节。类似地,Flink的堆外状态后端基于本地嵌入式RocksDB实例&…...
快速部署 DeepSeek R1 模型
1. DeepSeek R1 模型的介绍 DeepSeek R1 模型是专为自然语言处理(NLP)和其他复杂任务设计的先进大规模深度学习模型 ,其高效的架构设计是一大亮点,能够更高效地提取特征,减少冗余计算。这意味着在处理海量数据时&…...
Java全栈项目实战:在线课程评价系统开发
一、项目概述 在线课程评价系统是一款基于Spring Boot Vue3的全栈应用,面向高校师生提供课程评价、教学反馈、数据可视化分析等功能。系统包含Web管理端和用户门户,日均承载10万课程数据,支持高并发访问和实时数据更新。 项目核心价值&…...
数据库系统概念第六版记录 四
1.sql组成 SQL 是最有影响力的商用市场化的关系查询语言。SQL 语言包括几个部分: 数据定义语言(DDL) ,它提供了定义关系模式、删除关系以及修改关系模式的命令。 数据操纵语言(DML) ,它包括查询语言,以及往数据库中插入元组、从数据库中删…...
