当前位置:网站首页>Compact格式下MySQL的数据如何存储到磁盘
Compact格式下MySQL的数据如何存储到磁盘
2022-08-02 07:02:00 【棒棒吃不胖】
查找文件存储格式
在MySQL命令行输入
show table status;
得到的Row_format列就是磁盘的存储格式
在InnoDB 1.0.X之前,InnoDB存储引擎提供了Compact和Redundant两种格式来存放行记录数据。
在InnoDB 1.0.X之后,开始又引入了新的文件格式(file format),新引入的文件格式称为Barracuda文件格式。
Barracuda文件格式下拥有两种新的行记录格式:Compressed和Dynamic。
| Antelope | Barracuda |
|---|---|
| Compact、Redundant | Compact、Redundant、Compressed和Dynamic |
查看Innodb存储引擎的文件格式
show variables like 'innodb_file_format';
Dynamic和Compact格式基本相同,只在行溢出数据的处理上有区别。
变长字段varchar存储数据
假设存储下列两行数据
| varchar(8) | char(3) | char(4) | |
|---|---|---|---|
| 第一行 | Innodb | a | b |
| 第二行 | Mysql | x | y |
上述数据的格式虽然以行的形式出现,但实际上在磁盘中并没有这种行。
第一行数据存储形式如下:
| 0x06 | null标志位 | 记录头信息 | Innodb | a | b |
|---|
第一列表示Innodb占据了6个字符,用十六进制表示为`0x06`
根据变长字段长度列表中描述的变长字段的信息去查找变长字段。
该列只记录变长类型的字符,定长的跳过省略。
第二行数据存储形式如下:
| 0x05 | null标志位 | 记录头信息 | Mysql | x | y |
|---|
第一列表示Mysql占据了5个字符,用十六进制表示为`0x05`
假设存储多个变长类型的数据,如下
| varchar(10) | varchar(10) | varchar(10) | char(1) | |
|---|---|---|---|---|
| linux | ubuntu | centos | x | |
| mysql | mongodb | redis | y | |
| http | nginx | apache | z |
当有多个变长的数据时,只存储变长数据,并且按照列的逆序存放。

不难看出,第一列存放三个变长字符类型的长度(用十六进制表示)。
以第三行为例,http、nginx、apache分别是4、5、6位,在实际存储时逆序存放,就像第一列所展示的,6、5、4。
所以总结一下:
| 变长字段列表(逆序存放) | null标志位 | 记录头信息 | 数据A | 数据B | 数据C |
|---|
null值的存储方式
规定:
若有Null值,bit位置是1
字段值不为null,bit位置是0
通过创建下列一张表来说明:
CREATE TABLE `students` (
`name` varchar(10) NOT NULL,
`address` varchar(255) DEFAULT NULL,
`gender` char(1) DEFAULT NULL,
`class` varchar(10) DEFAULT NULL,
`hobbies` varchar(255) DEFAULT NULL,
PRIMARY KEY (`name`)
)
其中已经插入了一行数据:
| name | address | gender | class | hobbies |
|---|---|---|---|---|
| roles | m | hobby_xx |
在第一列的变长字段列表中存储的信息:
name roles 变长型 5个字符长度 0x05 字段读取成功
address 为空 字段读取结束
gender 定长型 字段读取结束
class 为空 字段读取结束
hobbies hobby_xx 变长型 8个字符长度 0x08 字段读取成功
综上所述,根据逆序存放原则,第一列的内容是0x08 0x05

补充说明:
一个数据页就是16K大
数据页中的数据是一行行记录的
当行很大并且超过了数据页的大小
这就是行溢出
通过数据页里存放指针的bit位将其连接
此时数据页之间会用链表连接起来
边栏推荐
猜你喜欢

实例030:回文数

MySQL-FlinkCDC-Hudi enters the lake in real time

实例026:递归求阶乘

企业实训复现指导手册——基于华为ModelArts平台的OpenPose模型的训练和推理、基于关键点数据实现对攀爬和翻越护栏两种行为的识别、并完成在图片中只标注发生行为的人

LeetCode 2312. Sell Wood Blocks

【CNN回归预测】基于matlab卷积神经网络CNN数据回归预测【含Matlab源码 2003期】

敏捷、DevOps和嵌入式系统测试

在VMware上安装Metasploitable2

埋点开发流程

21 days learning challenge 】 【 sequential search
随机推荐
(2022牛客多校五)D-Birds in the tree(树形DP)
【心电信号】基于matlab心率检测【含Matlab源码 1993期】
电商库存系统的防超卖和高并发扣减方案
如何设计静态资源缓存方案
php删除一维数组中一个值
【机器学习】实验5布置:AAAI会议论文聚类分析
OC-NSString
“蔚来杯“2022牛客暑期多校训练营4,签到题NDKHL
A Preliminary Study on the Basic Principles of Formal Methods
OC-NSDictionary
【ROS基础】rosbag 的使用方法
59:第五章:开发admin管理服务:12:MongoDB的使用场景;(非核心数据,数据量比较大的非核心数据,人脸照片等隐私的小文件;)
MySQL-索引优化和查询优化
新产品立大功 伟世通第二季度营收双增
【故障诊断分析】基于matlab FFT轴承故障诊断(包络谱)【含Matlab源码 2002期】
MySQL批量更新
聊天机器人如何提升独立站的营销水平?
在VMware上安装Metasploitable2
Facebook社媒营销的5大技巧,迅速提高独立站转化率!
【网络】IP、子网掩码