【MySQL篇】行格式详解

news2025/2/12 6:08:38

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提供了四种行格式,分别是RedundantCompactDynamic Compressed

特性/格式RedundantCompactDynamicCompressed
存储效率最低,存在冗余中等,行头较小,适合常规数据高效,特别是对于大字段的存储极高,适用于大规模压缩,节省磁盘空间
适合场景旧版本兼容,较小数据表默认格式,常规数据库适合大字段存储和需要高压缩的场景大量数据表,磁盘空间有限,压缩需求高
行头大小较大,包含多余的标记和指针较小,更紧凑的存储结构较大,包含更多字段指针和溢出页信息行头较大,压缩后存储空间利用较高
大字段存储存储在行内或溢出页存储在行内或溢出页存储在外部溢出页,仅保存指针存储在溢出页,且经过压缩处理
压缩支持不支持压缩不支持压缩不支持压缩支持压缩,数据写入时自动压缩
性能较低,冗余存储带来性能损失性能平衡,适合一般负载性能较好,适合大字段,处理复杂数据表性能较低,解压缩开销较大
兼容性主要用于早期 MySQL 版本MySQL 5.0 之后推荐的默认行格式MySQL 5.0 之后推荐的格式用于对存储空间要求高的数据库
  • Redundant:不再推荐使用,主要用于与早期版本的兼容。
  • Compact:适用于常规数据存储,提供较好的性能和存储效率,是大多数情况下的默认行格式。
  • Dynamic:适合大字段、可变长度字段,特别是存储 TEXTBLOB 等类型的数据,能够有效提高存储效率。
  • 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,如图所示

在这里插入图片描述

为什么要逆序存放?

答:

  1. 记录头信息中,指向下一条记录的指针,指向的是记录头信息和真实数据的中间位置,这样可以往左读就是记录头信息,右就是真实数据,比较方便
  2. 使得靠前的变长字段长度列表和真实数据可以尽量在同一个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值字段被省略。

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

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

相关文章

嵌入式知识点总结 操作系统 专题提升(五)-内存

针对于嵌入式软件杂乱的知识点总结起来&#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.在1G内存的计算机能否malloc&#xff08;1.2G&#xff09;&#xff1f;为什么&#xff1f; 2.malloc能申请多大的空间&#xff1f; 3.内存管理有哪几种方式&#xff1f; 4.什…

动手学深度学习---深层神经网络

目录 一、神经网络1.1、模型训练1.2、损失函数1.2.1、分类&#xff1a;hinge loss/合页损失/支持向量机损失1.2.2、分类&#xff1a;交叉熵损失(softmax分类器)1.2.2.1 二分类交叉熵损失1.2.2.2 多分类交叉熵损失 1.2.3、回归&#xff1a;误差平方和&#xff08;SSE&#xff09…

java基础6(黑马)

一、static 1.static修饰成员变量 static&#xff1a;叫静态&#xff0c;可以修饰成员变量、成员方法。 成员变量按照有无static&#xff0c;分两种。 类变量&#xff1a;有static修饰&#xff0c;属于类&#xff0c;在计算机中只有一份&#xff0c;会被类的全部对象共享。…

Transformer 详解:了解 GPT、BERT 和 T5 背后的模型

目录 什么是 Transformer? Transformer如何工作? Transformer 为何有用? 常见问题解答:机器学习中的 Transformer 在技​​术领域,突破通常来自于修复损坏的东西。制造第一架飞机的人研究过鸟类。莱特兄弟观察了秃鹫如何在气流中保持平衡,意识到稳定性比动力更重要。…

【Prometheus】MySQL主从搭建,以及如何通过prometheus监控MySQL运行状态

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

百问网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.…

人脸识别与人脸检测技术

人脸识别技术,作为一种基于人的脸部特征信息进行身份识别的生物识别技术,近年来在人工智能和计算机视觉技术的推动下取得了显著进展。它利用摄像机或摄像头采集含有人脸的图像或视频流,自动在图像中检测和跟踪人脸,进而对检测到的人脸进行一系列计算和分别判断。这一技术不…

ansible使用学习

一、查询手册 1、官网 ansible官网地址&#xff1a;https://docs.ansible.com 模块查看路径&#xff1a;https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html#plugins-in-ansible-builtin 2、命令 ansible-doc -s command二、相关脚本 1、服务…

基于 PyTorch 的树叶分类任务:从数据准备到模型训练与测试

基于 PyTorch 的树叶分类任务&#xff1a;从数据准备到模型训练与测试 1. 引言 在计算机视觉领域&#xff0c;图像分类是一个经典的任务。本文将详细介绍如何使用 PyTorch 实现一个树叶分类任务。我们将从数据准备开始&#xff0c;逐步构建模型、训练模型&#xff0c;并在测试…

【STM32系列】利用MATLAB配合ARM-DSP库设计IIR数字滤波器(保姆级教程)

ps.源码放在最后面 设计FIR数字滤波器可以看这里&#xff1a;利用MATLAB配合ARM-DSP库设计FIR数字滤波器&#xff08;保姆级教程&#xff09; 设计IIR滤波器 MATLAB配置 设计步骤 首先在命令行窗口输入"filterDesigner"&#xff0c;接着就会跳出以下界面&#xf…

如何在本地部署deepseek?

1、打开ollama官网&#xff0c;点download&#xff08;下载需要翻墙 https://ollama.com/ 2、双击下载好的OllamaSetup.exe&#xff0c;一直点下一步即可。 3、winR 输入cmd&#xff0c;打开命令提示符&#xff0c;输入ollama。有以下提示即安装完成。 4、可以根据 nvidia-…

AJAX项目——数据管理平台

黑马程序员视频地址&#xff1a; 黑马程序员——数据管理平台 前言 功能&#xff1a; 1.登录和权限判断 2.查看文章内容列表&#xff08;筛选&#xff0c;分页&#xff09; 3.编辑文章&#xff08;数据回显&#xff09; 4.删除文章 5.发布文章&#xff08;图片上传&#xff0…

MarsCode AI插件在IntelliJ IDEA中使用

文章目录 前言一、MarsCode是什么&#xff1f;二、下载三、使用1、登录2、操作界面3、生成代码4、解释代码5、注释代码6、生成单测7、智能修复8、代码补全 总结 前言 随着 AI 技术浪潮席卷而来&#xff0c;各类 AI 工具呈爆发式涌现&#xff0c;深度融入我们的日常与职场&…

如何将网站提交百度收录完整SEO教程

百度收录是中文网站获取流量的重要渠道。本文以我的网站&#xff0c;www.mnxz.fun&#xff08;当然现在没啥流量&#xff09; 为例&#xff0c;详细讲解从提交收录到自动化维护的全流程。 一、百度收录提交方法 1. 验证网站所有权 1、登录百度搜索资源平台 2、选择「用户中心…

C# OpenCV机器视觉:SoftNMS非极大值抑制

嘿&#xff0c;你知道吗&#xff1f;阿强最近可忙啦&#xff01;他正在处理一个超级棘手的问题呢&#xff0c;就好像在一个混乱的战场里&#xff0c;到处都是乱糟糟的候选框&#xff0c;这些候选框就像一群调皮的小精灵&#xff0c;有的重叠在一起&#xff0c;让阿强头疼不已。…

生信云服务器:让生物信息学分析更高效、更简单【附带西柚云优惠码】

随着生物信息学的快速发展&#xff0c;基因组测序、单细胞分析等复杂任务逐渐成为研究者们的日常工作。然而&#xff0c;个人电脑在处理这些任务时往往面临性能瓶颈&#xff0c;如内存不足、运算速度慢等问题&#xff0c;导致分析任务频繁失败或崩溃。为了解决这一难题&#xf…

【清晰教程】通过Docker为本地DeepSeek-r1部署WebUI界面

【清晰教程】本地部署DeepSeek-r1模型-CSDN博客 目录 安装Docker 配置&检查 Open WebUI 部署Open WebUI 安装Docker 完成本地DeepSeek-r1的部署后【清晰教程】本地部署DeepSeek-r1模型-CSDN博客&#xff0c;通过Docker为本地DeepSeek-r1部署WebUI界面。 访问Docker官…

Flink-序列化

一、概述 几乎每个Flink作业都必须在其运算符之间交换数据&#xff0c;由于这些记录不仅可以发送到同一JVM中的另一个实例&#xff0c;还可以发送到单独的进程&#xff0c;因此需要先将记录序列化为字节。类似地&#xff0c;Flink的堆外状态后端基于本地嵌入式RocksDB实例&…

快速部署 DeepSeek R1 模型

1. DeepSeek R1 模型的介绍 DeepSeek R1 模型是专为自然语言处理&#xff08;NLP&#xff09;和其他复杂任务设计的先进大规模深度学习模型 &#xff0c;其高效的架构设计是一大亮点&#xff0c;能够更高效地提取特征&#xff0c;减少冗余计算。这意味着在处理海量数据时&…

数据库系统概念第六版记录 四

1.sql组成 SQL 是最有影响力的商用市场化的关系查询语言。SQL 语言包括几个部分: 数据定义语言(DDL) &#xff0c;它提供了定义关系模式、删除关系以及修改关系模式的命令。 数据操纵语言(DML) &#xff0c;它包括查询语言&#xff0c;以及往数据库中插入元组、从数据库中删…