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⾏格式会采⽤压缩算法对⻚⾯进⾏压缩。

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

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

相关文章

Blender怎么样启动默认移动和Cavity效果

在使用Blender的过程中,有一些特殊的技巧很重要。 比如默认地设置blender打开时,就是移动物体,这样怎么样设置的呢? 需要在界面里打开下面的菜单: 这样就找到默认设置的地方,把下面的移动勾选起来,这样点…

3.C++ Make

1.Makefile 1.1 什么是 Makefile 一个工程中有很多文件,文件之间都是相辅相成有着编译的先后顺序,但是如果自己手动根据编译顺序编译文件造成速度非常慢。Makefile 是”自动化编译“,只需一个 make 指令系统就会根据编译顺序帮自己编译文件…

Java-Tomcat

一、web补充技术 ①:B/S架构 主流的方式,只要有浏览器即可。编程方式直接基于socket即可 ②:javascript 简称js,早期只是实现在客户端的浏览器的动态效果,但服务端不会解释运行,所以本质上是静态资源。 …

UE4_动画基础_角色的缩放

以第三人称模板进行制作。 一、首先为角色缩放新建粒子效果 1、新建niagara system,重命名为NS_Shrink。 2、双击打开设置参数: 发射器重命名: Emitter State: 发射器一次喷发数量: 粒子初始大小,生命周…

Go协程池gopool源码解析

1、gopool简介 Repository:https://github.com/bytedance/gopkg/tree/develop/util/gopool gopool is a high-performance goroutine pool which aims to reuse goroutines and limit the number of goroutines. It is an alternative to the go keyword. gopool的…

【Linux进阶之路】地址篇

文章目录 一、ipv4地址1. 基本概念2. 分类3.CIDR4.特殊的ip地址 二、IP协议1. 协议字段2.分片与重组3.路由 三、NAT技术1.公有和私有2.NAT3.NAPT 四、ARP协议1.MAC地址2.ARP 五、DHCP协议六、DNS协议尾序 一、ipv4地址 1. 基本概念 概念:IP地址,英文全…

从零自制docker-8-【构建实现run命令的容器】

文章目录 log "github.com/sirupsen/logrus"args...go moduleimport第三方包失败package和 go import的导入go build . 和go runcli库log.SetFormatter(&log.JSONFormatter{})error和nil的关系cmd.Wait()和cmd.Start()arg……context.Args().Get(0)syscall.Exec和…

【Leetcode每日一题】 递归 - 验证二叉搜索树(难度⭐⭐)(53)

1. 题目解析 题目链接:98. 验证二叉搜索树 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 中序遍历是二叉树遍历中的一种重要方式,它按照左子树、根节点、右子树的顺序访问每个节点。这种方式…

2024mathorcup妈妈杯数学建模A题思路模型

2024mathorcup妈妈杯数学建模A题思路模型:比赛开始后第一时间更新,更新见文末名片,下面对2022年B题进行介绍: 2022Mathorcup B题题目介绍 ​ B题无人仓的搬运机器人调度问题本题考在无人仓内的仓库管理问题之一,搬运机…

机场数据治理系列介绍(5)民用机场智慧能源系统评价体系设计

目录 一、背景 二、体系设计 1、评价体系设计维度 2、评价体系相关约定 3、评价指标体系框架设计 4、能源利用评价指标 5、环境友好评价指标 6、智慧管控评价指标 7、安全保障评价指标 三、具体落地措施 一、背景 在“双碳”国策之下,各类机场将能源系统建…

深入解析template,掌握C++模板的精髓!

掌握C模板(template)的优雅之道! 一、什么是模板?二、模板如何工作?三、C 中的模板类型3.1、 类模板3.2、 函数模板 四、模板参数推导4.1、模板参数推导示例4.2、函数模板参数推导4.3、类模板参数推导(C17 …

2024年MathorCup妈妈杯数学建模思路C题思路解析+参考成品

1 赛题思路 (赛题出来以后第一时间在群内分享,点击下方群名片即可加群) 2 比赛日期和时间 报名截止时间:2024年4月11日(周四)12:00 比赛开始时间:2024年4月12日(周五)8:00 比赛结束时间&…

GPU部署ChatGLM3

首先,检查一下自己的电脑有没有CUDA环境,没有的话,去安装一个。我的电脑是4060显卡,买回来就自带这些环境了。没有显卡的话,也不要紧,这个懒人安装包支持CPU运行,会自动识别没有GPU,…

启明智显M4核心板驱动17寸屏 为您打造无与伦比的视觉盛宴

近日,启明智显推出M4核心板驱动17寸屏,8 Link LVDS接口下1280*1024分辨率为用户展现了超强的视觉体验。 M4核心板采用纯国产架构,内置了16位DDR内存,为设备提供强大的数据处理能力和高效的运行速度。无论是处理复杂的任务还是进…

【简单讲解下C++max函数的使用】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

Java | Leetcode Java题解之第13题罗马数字转整数

题目&#xff1a; 题解&#xff1a; class Solution {Map<Character, Integer> symbolValues new HashMap<Character, Integer>() {{put(I, 1);put(V, 5);put(X, 10);put(L, 50);put(C, 100);put(D, 500);put(M, 1000);}};public int romanToInt(String s) {int …

考研数学|刷题用汤家凤《1800》还是张宇《1000》?看完这篇你就懂了

考研数学的复习是一个系统的过程&#xff0c;不同的习题集有各自的特点和适用场景。汤家凤的1800题和张宇的1000题都是非常受欢迎的考研数学复习资料&#xff0c;它们各有侧重点和优势。 汤家凤的1800题以其全面性和基础性著称&#xff0c;题目覆盖了考研数学的各个知识点&…

缓存穿透问题

缓存穿透 &#xff1a;缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。 常见的两种解决方案&#xff1a; 1.缓存空对象 优点&#xff1a;实现简单&#xff0c;维护方便 缺点&#xff1a;占用…

【40分钟速成智能风控4】传统风险管理体系

目录 人工审核 纸质材料评估 电话回访 线下走访尽调 专家模型 业务规则库 专家调查权重法 熵权法 随着大数据和机器学习技术的发展与成熟&#xff0c;智能风控已经逐步取代传统风控&#xff0c;成为国内互联网金融机构主流的风险管理模式。一方面&#xff0c;传统风控是…

U盘中病毒了会影响电脑吗 U盘中病毒了怎么恢复数据 easyrecovery数据恢复软件免费版 easyrecovery绿色版破解版激活密钥无需注册

EasyRecovery是世界著名数据恢复公司 Ontrack 的技术杰作&#xff0c;EasyRecovery破解版是一个威力非常强大的硬盘数据恢复工具&#xff0c;能够帮你恢复丢失的数据以及重建文件系统。您只需要按软件提示一步一步操作&#xff0c;就能恢复出你电脑上的文档、表格、图片、音频、…