Mysql底层原理六: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⾏格式会采⽤压缩算法对⻚⾯进⾏压缩。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Yolov5的检测系统实战

文章目录 一、数据集 二、网络结构 三、完整文件目录介绍 四、测试分析 一、数据集 1、数据格式:图像数据(JPG格式),采用labelme标注后的图像(XML格式),训练需要的TXT格式 2、数据来源&…

【Python数据分析】让工作自动化起来,无所不能的Python

这里写目录标题 前言一、Python是办公自动化的重要工具二、Python是提升职场竞争力的利器三、Python是企业数字化的重要平台四、Python是AI发展的重要通道之一编辑推荐内容简介作者简介前言读者对象如何阅读本书目录 前言 随着我国企业数字化和信息化的深入,企业对…

[CSS]布局

盒子就是把网站分割成一小块一小块的吧,然后方便移动或者管理 布局属性 所谓的布局就是依靠css布局让html元素,可以按照UI设计师提供的设计稿进行HTML网页的内容排版并实现页面的布局效果。 布局的学习关键就是:1. 布局方式,2. …

SpringBoot+Vue,轻松实现网页版人脸登录与精准识别

目录 1、技术介绍 2、技术原理 2.1、人脸检测 ①参考模板法 ②人脸规则法 2.2、人脸跟踪 2.3、人脸比对 ①特征向量法 ②面纹模板法 识别过程 案例 一、springboot后端项目 1,拉取项目后,导入相关依赖jar包 2,执行sql文件夹下面…

Qt 中的项目文件解析和命名规范

🐌博主主页:🐌​倔强的大蜗牛🐌​ 📚专栏分类:QT❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、Qt项目文件解析 1、.pro 文件解析 2、widget.h 文件解析 3、main.cpp 文件解析 4、widget.cpp…

yuyv v4l2的数据转换成RGB

使用方法: 3840*2160是.yuv数据的分辨率 data.raw为yuv格式的raw数据 cv:显示 out.png 不显示,存储的文件名 python3 yuv_2_rgb.py data.raw cv 3840 2160或python3 yuv_2_rgb.py data.raw out.png 3840 2160 源码 yuv_2_rgb.py&#xff1…

antv X6离线文档部署 解决workspace configuration error问题

1.从github拉取源代码 x6开源库 下载至本地。 2.进入文件目录下 使用pnpm install 安装依赖 其中我遇到了两个问题 缺少python环境报错:解决如下: 安装python环境,将python加入系统环境变量path中 打开npm配置文件 编辑该文件加入python…

IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版

IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版 文章目录 IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版前言 第一步: IntelliJ IDEA 2024.1安装教程第 0 步&…

如何使用Tomcat+cpolar搭建本地站点并发布到公网分享好友远程访问

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器拥有强大功能,由于其可以实…

(二十七)Flask之数据库连接池DBUtils库

目录: 每篇前言:DBUtils库模式一(底层使用threading.local实现):模式二: Flask中使用方式一:直接将DBUtils初始化放到settings.py文件中方式二:从utils文件夹中导入 脚本使用DBUtils…

防止公司文件泄密的有效措施有哪些

防止公司文件泄密的有效措施有哪些 公司文件防止泄密是一项涉及多个层面和多种策略的综合性工作。以下列举了多种常用且有效的防止公司文件泄密的方式. 一、政策与流程制定 保密协议(NDA):要求员工、合作伙伴、供应商等签署保密协议&#x…

【计算机基础】期末考试必考,学会就能提高 40 分

二进制与十进制相互转换的详细过程及例题解析 二进制和十进制是两种常用的数制系统。二进制系统仅使用0和1两个数字,而十进制系统则使用0到9的十个数字。在计算机科学和数字电路设计等领域,经常需要在这两种数制之间进行转换。本文将详细介绍二进制与十…

【域适应】基于域分离网络的MNIST数据10分类典型方法实现

关于 大规模数据收集和注释的成本通常使得将机器学习算法应用于新任务或数据集变得异常昂贵。规避这一成本的一种方法是在合成数据上训练模型,其中自动提供注释。尽管它们很有吸引力,但此类模型通常无法从合成图像推广到真实图像,因此需要域…

Springboot项目的测试类书写(速通)

目录 前言1. 单元测试的测试类2. 框架测试的测试类 前言 在实际开发中,如果只是做一个简单的单元测试(不涉及端到端、数据库交互、API调用、消息队列处理等),我为了方便一般都是找块儿地方写一个main方法来跑一下就行了&#xff…

CSS-文字环绕浮动、行内块分页、三角强化妙用、伪元素选择器

文字环绕浮动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>文字环绕浮动效果</title><s…

[leetcode] all-nodes-distance-k-in-binary-tree 二叉树中所有距离为 K 的结点

. - 力扣&#xff08;LeetCode&#xff09; 给定一个二叉树&#xff08;具有根结点 root&#xff09;&#xff0c; 一个目标结点 target &#xff0c;和一个整数值 k 。 返回到目标结点 target 距离为 k 的所有结点的值的列表。 答案可以以 任何顺序 返回。 示例 1&#xff1a…

玩转公众号|掌握公众号运营技巧,让账号脱颖而出

随着互联网的普及&#xff0c;微信公众号已经成为了企业进行品牌宣传、产品推广和客户服务的重要渠道。而且&#xff0c;企业微信公众号是可以进行二次开发的&#xff0c;这样就能够满足企业的私域运营的需求。然而&#xff0c;对于许多企业来说&#xff0c;运营公众号和二次开…

LLM 构建Data Multi-Agents 赋能数据分析平台的实践之②:数据治理之二(自动处理)

前述 在前文的multi Agents for Data Analysis的设计说起&#xff0c;本文将继续探索和测试借助llm实现基于私有知识库的数据治理全自动化及智能化。整体设计如下&#xff1a; 整个体系设计了3个Agent以及一个Planer&Execute Agent&#xff0c;第一个Agent用于从企业数据…

结合ArcGIS+SWAT模型+Century模型:流域生态系统水-碳-氮耦合过程模拟

原文链接&#xff1a;结合ArcGISSWAT模型Century模型&#xff1a;流域生态系统水-碳-氮耦合过程模拟https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&tempkeyMTI2NV9sMGRZNUJoVkNVc1ZzSzRuMl9XXzhqX0R3cXpESWFwM1E4cFY4ejNqWFh3VUl0dlZkNWk4b20ydFdFTy1xS2ZObGN0Z0ZXSjly…

大话设计模式——9.单例模式(Singleton Pattern)

简介 确保一个类只有一个实例&#xff0c;并提供全局访问点来获取该实例&#xff0c;是最简单的设计模式。 UML图&#xff1a; 单例模式共有两种创建方式&#xff1a; 饿汉式&#xff08;线程安全&#xff09; 提前创建实例&#xff0c;好处在于该实例全局唯一&#xff0c;不…