当前位置: 首页 > news >正文

InnoDB 行记录格式(“存储一行行数据的结构“)

1.行格式

1.1 Compact行格式

1.1.1 示意图

1.1.2 准备一下

1)建表
mysql>	CREATE	TABLE	record_format_demo	(->    	c1	VARCHAR(10),->    	c2	VARCHAR(10)	NOT	NULL,->    	c3	CHAR(10),->    	c4	VARCHAR(10)->	)	CHARSET=ascii	ROW_FORMAT=COMPACT;
Query	OK,	0	rows	affected	(0.03	sec)

2)插入数据
mysql>	INSERT	INTO	record_format_demo(c1,	c2,	c3,	c4)	VALUES('aaaa',	'bbb',	'cc',	'd'),	('eeee',	'fff',	NULL,
NULL);
Query	OK,	2	rows	affected	(0.02	sec)
Records:	2 	Duplicates:	0 	Warnings:	0

4)查看一下
mysql>	SELECT	*	FROM	record_format_demo;
+------+-----+------+------+
|	c1  	|	c2 	|	c3  	|	c4  	|
+------+-----+------+------+
|	aaaa	|	bbb	|	cc  	|	d   	|
|	eeee	|	fff	|	NULL	|	NULL	|
+------+-----+------+------+
2	rows	inset	(0.00	sec)

1.1.3 变长字段长度列表

我们知道Mysql支持一些变长的数据类型,比如VARCHAR(M)、各种TEXT类型,各种BLOG类型,我们也可以把拥有这些数据类型的列称为 变长字段变长字段中存储多少字节的数据是不固定的,所以我们在存储真实数据的时候需要顺便把这些数据占用的字节也存起来。

1)INSERT INTO record_format_demo(c1, c2, c3, c4) VALUES  (‘aaaa’, ‘bbb’, ‘cc’, ‘d’)

由于是ascii字符集,所以每个字符占一个字节,所以变长列(这里不包含cc,因为是char)每个长度为 04 03 01,另外非常重要的一点是:变长字段长度列表是逆序排列的,所以最终的的列表为 01 03 04。

用图来表示就是:

提出问题:当列中出现NULL时怎么存储那?往下看😘

2)INSERT INTO record_format_demo  (c1, c2, c3, c4)  VALUES  (‘eeee’, ‘fff’, NULL,NULL)

1)上面的列都是非NULL的,如果出现NULL怎么存储那?**答案是:值为NULL的列是不存储的。**也就是说对于2)来说,c4列为NULL,所以第二条记录只需要存储c1和c2的列长度即可(c3是char,不是变长列)。

用图来表示就是:

1.1.4 NULL值列表

1)存放规则
  1. 是什么列都会算进去吗?:主键列、被NOT NULL修饰的列都是不可以存储NULL值的,所以在统计的时候不会把这些列算进去。⽐⽅说表record_format_demo的3个列 c1、c3、c4都是允许存储NULL值的,⽽c2列是被NOT NULL修饰,不允许存储NULL值。只统计NOT NULL的列
  2. 按照什么规则来统计 NOT NULL的列那?:1、用位来表示,1表示NULL,0表示NOT NULL; 2、逆序

2)举例说明

像上面的的表record_format_demo有3个值允许为NULL,所以这3个列和二进制的对应关系如下:

4)第一条记录怎么存

INSERT INTO record_format_demo(c1, c2, c3, c4) VALUES  (‘aaaa’, ‘bbb’, ‘cc’, ‘d’),因为这条记录没有null值,所以存储之后长这个样:

5) 第二条记录怎么存

INSERT INTO record_format_demo  (c1, c2, c3, c4)  VALUES  (‘eeee’, ‘fff’, NULL,NULL),由于这条记录中c3和c4都为NULL,所以这3个列对应的二进制的情况如下:

6)有个规则要说明一下

为什么上面两个图都展示的是8个位,因为总共就3个位,如果NOT NULL 超过8个位,那就要用2个字节表示。

7) 两条记录完整展示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.1.5 记录头信息

1)说明

除了变⻓字段⻓度列表、NULL值列表之外,还有⼀个⽤于描述记录的记录头信息,它是由固定的5个字节组成。5个字节也就是40个⼆进制位。

2)图示

3)拿第一条记录图示说明

这个说明 head_no有值、next_record有值。

1.1.6 记录的真实数据

1)真实数据里还有“假数据”

对于record_format_demo来说,记录的真实数据除了c1、c2、c3、c4这⼏个我们⾃⼰定义的列的数据以外,MySQL会为每个记录默认的添加⼀些列(也称为隐藏列),具体的列如下:

**这里需要提一下InnoDB表对主键的生成策略:优先使用用户自定义的主键作为主键,如果没有就是用Unique键作为主键,如果都没有的话,InnoDB会为表默认生成一个名为row_id的隐藏列作为主键。**其余两个transaction_id、roll_pointer是一定有的,row_id是可选的。

2) 两条记录完整展示

注意以下几点:

  1. 由于record_format_demo没有定义主键,所以会生成row_id
  2. 表record_format_demo使⽤的是ascii字符集,所以0x61616161就表示字符串’aaaa’,0x626262就表示字符串’bbb’,以此类推
  3. **char的填充策略:**注意第1条记录中c3列的值,它是CHAR(10)类型的,它实际存储的字符串是:‘cc’,⽽ascii字符集中的字节表示是’0x6363’,虽然表示这个字符串只占⽤了 2个字节,但整个c3列仍然占⽤了10个字节的空间,除真实数据以外的8个字节的统统都⽤空格字符填充,空格字符在ascii字符集的表示就是0x20
  4. **有了NULL值列表,真实列就不需要存储了:**第2条记录中c3和c4列的值都为NULL,它们被存储在了前边的NULL值列表处,在记录的真实数据处就不再冗余存储,从⽽节省存储空间。

1.2 Redundant行格式

Redundant⾏格式是MySQL5.0之前⽤的⼀种⾏格式,也就是说它已经⾮常⽼ 了,如果想研究可以自己看小册。

1.3 Dynamic和Compressed行格式

下边要介绍另外两个⾏格式,Dynamic和Compressed⾏格式,我现在使⽤的MySQL版本是5.7,它的默认⾏格式就是Dynamic,这俩⾏格式和Compact⾏格式挺像, 只不过在处理⾏溢出数据时有点⼉分歧,它们不会在记录的真实数据处存储字段真实数据的前768个字节,⽽是把所有的字节都存储到其他⻚⾯中,只在记录的真 实数据处存储其他⻚⾯的地址,就像这样(可以理解为引用,768个字节如果换成200多个引用是不是更好拿):😨

2、总结

1)⻚是MySQL中磁盘和内存交互的基本单位,也是MySQL是管理存储空间的基本单位。

2)指定和修改⾏格式的语法如下:

CREATE TABLE 表名 (列的信息) ROW_FORMAT=⾏格式名称

ALTER TABLE 表名 ROW_FORMAT=⾏格式名称

3)InnoDB目前定义了4种行格式:

Compact:

Redundant:

Dynamic和Compressed⾏格式

这两种⾏格式类似于COMPACT⾏格式,只不过在处理⾏溢出数据时有点⼉分歧,它们不会在记录的真实数据处存储字符串的前768个字节,⽽是把所有的 字节都存储到其他⻚⾯中,只在记录的真实数据处存储其他⻚⾯的地址。 另外,Compressed⾏格式会采⽤压缩算法对⻚⾯进⾏压缩。

相关文章:

InnoDB 行记录格式(“存储一行行数据的结构“)

1.行格式 1.1 Compact行格式 1.1.1 示意图 1.1.2 准备一下 1)建表 mysql> CREATE TABLE record_format_demo (-> c1 VARCHAR(10),-> c2 VARCHAR(10) NOT NULL,-> c3 CHAR(10),-> c4 VARCHAR(10)-> ) CHARSETascii ROW_FORMATCOM…...

【洛谷】P9236 [蓝桥杯 2023 省 A] 异或和之和

题目链接 P9236 [蓝桥杯 2023 省 A] 异或和之和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 1. 暴力求解 直接枚举出所有子数组,求每个子数组的异或和,再对所有的异或和求和 枚举所有子数组的时间复杂度为O(N^2)&…...

ThreadLocal加切面实现线程级别的方法缓存

1、实现效果 当一个请求线程多次请求A方法时,只会触发一次A方法的实际调用,会将方法结果缓存起来,避免多次调用。 2、实现过程 1. 需要一个注解ThreadLocalCache,在需要缓存的方法上加上该注解 2. 需要一个切面,借助ThreadLocal,将结果缓存起来,利用环绕通知来实现方法拦截从…...

使用 Flume 将 CSV 数据导入 Kafka:实现实时数据流

使用 Flume 将 CSV 数据导入 Kafka:实现实时数据流 文介绍了如何使用 Apache Flume 将 CSV 格式的数据从本地文件系统导入到 Apache Kafka 中,以实现实时数据流处理。通过 Flume 的配置和操作步骤,我们可以轻松地将数据从 CSV 文件中读取并发…...

对代理模式的理解

目录 一、前言二、案例1 代码2 自定义代理类【静态代理】2.1 一个接口多个实现,到底注入哪个依赖呢?2.1.1 Primary注解2.1.2 Resource注解(指定name属性)2.1.3 Qualifier注解 2.2 面向接口编程2.3 如果没接口咋办呢?2.…...

#QT项目实战(天气预报)

1.IDE:QTCreator 2.实验: 3.记录: (1)调用API的Url a.调用API获取IP whois.pconline.com.cn/ipJson.jsp?iphttp://whois.pconline.com.cn/ipJson.jsp?ip if(window.IPCallBack) {IPCallBack({"ip":&quo…...

数据挖掘|关联分析与Apriori算法详解

数据挖掘|关联分析与Apriori算法 1. 关联分析2. 关联规则相关概念2.1 项目2.2 事务2.3 项目集2.4 频繁项目集2.5 支持度2.6 置信度2.7 提升度2.8 强关联规则2.9 关联规则的分类 3. Apriori算法3.1 Apriori算法的Python实现3.2 基于mlxtend库的Apriori算法的Python实现 1. 关联分…...

ChatGPT Excel 大师

原文:ChatGPT Excel Mastery 译者:飞龙 协议:CC BY-NC-SA 4.0 序言 欢迎来到 Excel 掌握的变革之旅,在这里,尖端技术和永恒专业知识在“ChatGPT Excel 掌握:释放专家技巧和窍门的力量”中融合。在当今快节…...

C 语言中的 end, _end 符号

使用 man 3 end 可以看到相关符号的解释 这些符号不是在 C 语言文件和头文件中定义的,它们是 ld 在链接所有 .o 文件的时候自己添加的。 end 和 _end 的地址,就是最终程序的堆的起始地址 要打印它们的话,一个样例程序在下面: …...

绿联 安装PDF工具

这是一个强大的本地托管的基于 Web 的 PDF 操作工具,使用 docker,允许您对 PDF 文件执行各种操作,例如拆分、合并、转换、重组、添加图像、旋转、压缩等。这个本地托管的 Web 应用程序最初是 100% ChatGPT 制作的应用程序,现已发展…...

备战蓝桥杯---数论相关问题

目录 一、最大公约数和最小公倍数 二、素数判断 三、同余 四、唯一分解定理 五、约数个数定理 六、约数和定理 五、快速幂 六、费马小定理 七、逆元 一、最大公约数和最小公倍数 文章链接:最大公约数和最小公倍数 二、素数判断 文章链接:在J…...

苹果手表Apple Watch录了两个半小时的录音,却只能播放4秒,同步到手机也一样,还能修复好吗?

好多人遇到这个情况,用苹果手表Apple Watch录音,有的录1个多小时,有的录了3、4小时,甚至更长时间,因为手表没电,忘记保存等原因造成录音损坏,都是只能播放4秒,同步到手机也一样&…...

RGB三通道和灰度值的理解

本文都是来自于chatGPT的回答!!! 目录 Q1:像素具有什么属性?Q2:图像的色彩是怎么实现的?Q3:灰度值和颜色值是一个概念吗?Q4:是不是像素具有灰度值,也有三个颜色分量RGB?Q5:灰度图像是没有色彩的吗?Q6: 彩色图像是既具有灰度值也具有RGB三…...

ARM、X86、RISC-V三分天下

引入: 简单的介绍一下X86、ARM、RISC-V三种cpu架构的区别和应用场景。 目录 简单概念讲解 1. X86架构 2. ARM架构 3. RISC-V架构 应用场景 X86、ARM和RISC-V是三种不同的CPU架构,它们在设计理念、指令集和应用场景上有一些区别。 简单概念讲解 1. X…...

力控机器人原理及力控制实现

力控机器人原理及力控制实现 力控机器人是一种能够感知力量并具有实时控制能力的机器人系统。它们可以在与人类进行精准协作和合作时,将力传感技术(Force Sensing Technology)和控制算法(Control Algorithm)结合起来&a…...

最小生成树

最小生成树问题是指给定一个带权的无向图,删除一些边使得这个无向图变成一棵树,并且权值之和最小。 解决此类问题的方法主要有两种:Prim算法,Kruskal算法 Prim 算法 从一个点开始,逐步扩展,每次选择权值…...

二维动画制作软件 Animate 2024 for mac激活版

Animate 2024 for Mac是一款功能强大的二维动画制作软件,专为Mac用户打造。它提供了丰富的动画编辑功能,使用户能够轻松创建出生动逼真的动画作品。无论是短片、广告还是游戏等应用领域,Animate 2024都能发挥出出色的表现。 软件下载&#xf…...

相对论中关于光速不变理解的补充

近几个月在物理直播间聊爱因斯坦相对论,发现好多人在理解爱因斯坦相对论关于基本假设,普遍认为光速是不变的,质能方程 中光速的光速不变的,在这里我对这个假设需要做一个补充,他是基于质能方程将光速C 在真是光速变化曲…...

面试(04)————JavaWeb

1、网络通讯部分 1.1、 TCP 与 UDP 区别? 1.2、什么是 HTTP 协议? 1.3、TCP 的三次握手,为什么? 1.4、HTTP 中重定向和请求转发的区别? 1.5、 Get 和 Post 的区别? 2、cookie 和 session 的区别&am…...

Debian12 使用 nginx 与 php8.2 使用 Nextcloud

最近将小服务器升级了下系统,使用了 debian12 的版本,正好试试 nginx 和 php-fpm 这种方式运行 Nextcloud 这个私有云的配置。 一、基本系统及应用安装 系统:debian12 x86_64 位版本最小安装,安装后可根据自己需求安装一些工具&…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

三体问题详解

从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...

字符串哈希+KMP

P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...

基于小程序老人监护管理系统源码数据库文档

摘 要 近年来&#xff0c;随着我国人口老龄化问题日益严重&#xff0c;独居和居住养老机构的的老年人数量越来越多。而随着老年人数量的逐步增长&#xff0c;随之而来的是日益突出的老年人问题&#xff0c;尤其是老年人的健康问题&#xff0c;尤其是老年人产生健康问题后&…...