mysql中的行格式之compact格式分析

mysql中的行格式之compact格式分析

mysql行格式

所谓行格式,就是指mysql一行数据的存储格式。

InnoDB 储存引擎支持有四种行储存格式:Compact、Redundant、Dynamic 和 Compressed。

Redundant是很古老的行格式了,因为占用空间最多,导致内存碎片化最严重,比较低效,现在基本上已经不用了,

Compact是MySQL 5.0之后引入的行记录存储方式,是一种紧凑的行格式,设计的初衷就是为了让一个数据页中可以存放更多的行记录,从 MySQL 5.1 版本之后,行格式默认设置成 Compact。

Dynamic和Compressed 两个都是紧凑的行格式,它们的行格式都和 Compact 差不多,因为都是基于 Compact进行改进。从 MySQL5.7 版本之后,默认使用 Dynamic 行格式。

应该说Compact格式是一个比较经典的格式,因此本文将以Compact格式为例,详细介绍其具体的内容。

mysql表的数据存储在哪里?

进入mysql,查看mysql的data目录在哪里,例如下面所示:

mysql> show variables like "datadir";
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)

进入该目录中,会看到一个一database命名的目录,进入该目录中,则会看到一个以表名+.ibd的文件,该文件即是存储mysql表数据的文件。

COMPACT 行格式长什么样?

compact行格式如下所示:

在这里插入图片描述

主要分为两个个部分

  • 存储的额外数据
  • 存储的真实数据

存储的额外数据中包含了变长数据列的长度NULL值的列表记录头信息

存储的真实数据中包含了三个隐藏列真实数据

首先看存储的额外数据。

存储的额外数据的第一块用于记录变长数据列的长度,其排放顺序是逆序排放的。

例如下面这张表,name和city列为变长字段,由于是逆序排放的,第一条记录的变长数据列的长度的值为07 03

+------+-------+---------+-------+
| id   | name  | city    | level |
+------+-------+---------+-------+
|    0 | tom   | Nanjing | a     |
|    1 | kitty | Beijing | b     |
|    2 | simth | Wuhan   | c     |
+------+-------+---------+-------+

额外数据的第二块是记录NULL值的列表,它使用bit来标记列值是否为空。其低位(最右侧的位)标记第0个列是否为NULL。

例如这里的第一条记录,其city列为NULL,因此其NULL列的值为00000100,为04。

+------+-------+---------+-------+
| id   | name  | city    | level |
+------+-------+---------+-------+
|    0 | Nancy | NULL    | c     |
|    1 | NULL  | NULL    | c     |

额外数据的第三块是记录头信息,其格式如下所示,共5个字节:

名称大小 (bit)描述
预留位11没有使用
预留位21没有使用
delete_mask1标记该记录是否被删除
min_rec_mask1B+树里每一层的非叶子节点里的最小值都有这个标记
n_owned4表示当前记录拥有的记录数
heap_no13表示当前记录在记录堆的位置信息
record_type3标识当前记录的类型:0代表的是普通类型,1代表的是B+树非叶子节点,2代表的是最小值数据,3代表的是最大值数据。
next_record16表示下一条记录的相对位置

接下来是存储的真实数据部分:

其第一部分包含三个隐藏列,其格式如下所示:

  • DB_ROW_ID:该字段占6个字节,用于标识一条记录
  • DB_TRX_ID:该字段占6个字节,其值为事务ID
  • DB_ROLL_PTR:该字段占7个字节,其值为回滚指针

其第二部分存储的就是每个非NULL列真实的数据。

有了这些基础,下面对照ibd文件,具体分析。

实验分析ibd文件格式

下面将通过分析.ibd文件的方式来进一步了解。首先需要准备好环境。这里我使用的是docker环境进行环境准备的。

首先使用docker pull拉取最新版本的mysql的镜像。

docker pull mysql

再镜像拉取完毕之后启动mysql,这里我将本地目录挂载到了mysql容器中,便于后续获取ibd文件。

docker run -v /home/work/data/mysql:/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD=111111 -d 镜像的id

进入mysql容器中,创建demo的数据库,并在demo数据库中创建user_tbl表。user_tbl表包含了四个字段,其中name和city字段为变长字段。id和level为固定长度字段。

create database demo;
use demo;
create table user_tbl (id int,name varchar(20) comment 'mutable-length',city varchar(20) comment 'mutable-length',level char(1) comment 'fix-length'
)row_format=compact;

进一步,向user_tbl表中添加5条测试数据。

insert into user_tbl values(0,'tom','Nanjing','a');
insert into user_tbl values(1,'kitty','Beijing','b');
insert into user_tbl values(2,'simth','Wuhan','c');
insert into user_tbl values(3,'Nancy',NULL,'c');
insert into user_tbl values(4,NULL,NULL,'c');

退出容器,去挂载的目录中去获取idb文件,例如,我的目录就是/home/work/data/mysql/demo/user_tbl.ibd

通过二进制查看工具,例如notepad--可以很好的对其进行分析。通过记录中的字符串,可以很快地在二进制文件中定位到位置,例如在我的实验中,数据记录在文件中的位置如下所示:

mysql

有了这些数据,就可以对其进行分析了。

我这里获取到的五条的数据记录如下所示,对照上面讲解的Compact数据行格式,是一致的。

第一条数据格式:

07 03 //第三列长度为7 第二列长度为3
00 //NULL bit映射为空
00 00 10 00 2B //header info
00 00 00 00 02 00 //DB_ROW_ID 
00 00 00 00 07 19 //DB_TRX_ID
82 00 00 01 1E 01 10 //DB_ROLL_PTR 
80 00 00 00 //0
74 6F 6D    //tom 
4E 61 6E 6A 69 6E 67 //Nanjing 
61 //a
01 

第二条数据格式:

07 05 //第三列长度为7 第二列长度为5
00 //NULL bit映射为空
00 00 18 00 2D //header info
00 00 00 00 02 01 //DB_ROW_ID 
00 00 00 00 07 1A //DB_TRX_ID
81 00 00 01 1E 01 10 //DB_ROLL_PTR 
80 00 00 01 //1
6B 69 74 74 79 //kitty
42 65 69 6A 69 6E 67 //Beijing
62 //b
01 

第三条数据格式:

05 05 //第三列长度为5 第二列长度为5
00 //NULL bit映射为空
00 00 20 00 2A //header info
00 00 00 00 02 02 //DB_ROW_ID 
00 00 00 00 07 1F //DB_TRX_ID
82 00 00 01 0A 01 10 //DB_ROLL_PTR 
80 00 00 02 //2
73 69 6D 74 68 //simth
57 75 68 61 6E //Wuhan
63 //c
01 

第四条数据格式:

05 //第二列长度为5
04 //NULL 00000100 第三列为NULL
00 00 28 00 24 //header info
00 00 00 00 02 03 //DB_ROW_ID 
00 00 00 00 07 20 //DB_TRX_ID
81 00 00 01 0E 01 10 //DB_ROLL_PTR 
80 00 00 03 //3
4E 61 6E 63 79 //Nancy
63 //c
01 

第五条数据格式:

// 没有变长列的长度
06 //NULL 00000110 第二列和第二列为NULL
00 00 30 FF 49 //header info
00 00 00 00 02 04 //DB_ROW_ID 
00 00 00 00 07 25 //DB_TRX_ID
82 00 00 01 0C 01 10 //DB_ROLL_PTR 
80 00 00 04 //4 
63 //c

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

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

相关文章

基于深度学习的高精度道路瑕疵检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度道路瑕疵(裂纹(Crack)、检查井(Manhole)、网(Net)、裂纹块(Patch-Crack)、网块(Patch-Net)、坑洼块&#x…

【C++】模板进阶—非类型模板参数、模板特化及模板的分离编译

🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸C 🛹Linux 📕 学习格言:博观而约取&#xff0…

什么是云应用程序?

应用程序优先的云服务的日益普及导致应用程序与云服务的融合程度比以前更深。应用程序和云之间的运行时边界正在从虚拟机转移到容器和函数。集成边界正在从仅访问数据库和消息代理转向应用程序的机械部分混合并在云中运行的边界。在这个最终架构中,应用程序是“云绑…

pwm呼吸灯

文章目录 一、呼吸灯二、代码实现三、引脚分配 一、呼吸灯 呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化,使用开发板上的四个led灯实现1s间隔的呼吸灯。 二、代码实现 c module pwm_led( input clk ,input rst_n ,output reg [3:0] led ); …

photoshop制作法线和凹凸贴图

做个选区 Ctrlj 法线贴图 生成凹凸贴图

Spring框架的创建和使用

目录 Spring框架概述 什么是Spring框架 什么是容器 什么是IoC容器 Spring的核心功能 IoC容器和普通程序开发的区别 DI Spring项目的创建和使用 Spring项目创建 创建一个maven项目 添加Spring框架支持 添加一个启动类 Spring项目的使用 存储Bean对象 获取并使用B…

应用级监控方案Spring Boot Admin

1.简介 Spring Boot Admin为项目常用的监控方式,可以动态的监控服务是否运行和运行的参数,如类的调用情况、流量等。其中分为server与client: server: 提供展示UI与监控服务。client:加入server,被监控的…

vue3,elementPlus和自己封装,点击 新增添加表单,删除表单,提交数据

ElementPlus下的form也有新增表单 如果你写H5等没找到合适的 自己也可以进行封装 实现3个代码讲解:1:ElementPlus的代码 2:自己书写的代码 3:自己把2的代码进行封装 1:ElementPlus的运行效果 点击提交 1:ElementPlus…

Python教程(3)——python开发工具vscode的下载与安装

Python的开发工具有很多款,很多都是非常好用的,其中vscode作为其中一款Python的开发工具,是非常轻量级的,今天我们来介绍一下vs code的下载与安装。 vscode的下载与安装 首先需要到vscode的官网,这个谷歌或者百度一下…

VSCode 注释后光标快速定位下一行

VSCode默认用 Ctrl / 注释一行时,光标停留在该行中。下面介绍如何注释后,光标会自动移动到下一行。 1.【View】 ->【Extensions】->【查找并安装Multi-command 扩展】 2.【File 】 -> 【Preferences 】->【Keyboard Shortcuts】&#xff08…

【人工智能】xAI——“X宇宙”又增添了一位新成员

个人主页:【😊个人主页】 🌞热爱编程,热爱生活🌞 文章目录 前言xAI团队成员做解开宇宙本质的AI 前言 有人问他,xAI公司是干啥的?马斯克的回答引用了其偶像、科幻作家道格拉斯・亚当斯的话&…

Python实现将pdf,docx,xls,doc,wps,zip,xlsx,ofd链接下载并将文件保存到本地

前言 本文是该专栏的第31篇,后面会持续分享python的各种干货知识,值得关注。 在工作上,尤其是在处理爬虫项目中,会遇到这样的需求。访问某个网页或者在采集某个页面的时候,正文部分含有docx,或pdf,或xls,或doc,或wps,或ofd,或xlsx,或zip等链接。需要你使用python自…

【运维小知识】(四)——linux常用命令

运维专栏:运维小知识 目录 1.🍁🍁用mv命令修改文件名 2.🍃🍃创建及删除文件夹即文件夹下所有文件 3.🍂🍂移动文件夹并重命名 4.🌿🌿复制文件 5.🍄&#x…

Python 算法基础篇之字符串操作:索引、切片、常用方法

Python 算法基础篇之字符串操作:索引、切片、常用方法 引言 1. 字符串的概念和创建2. 字符串的索引3. 字符串的切片4. 字符串的常用方法 a ) 查找子字符串 b ) 替换子字符串 c ) 拆分和连接字符串 总结 引言 字符串是一种常见的数据类型,在 Python 中对…

ARM微控制器 AM2432BSEFHIALXR、AM2432BSFFHIALV技术参数(32位MCU)

1、AM2432BSEFHIALXR 32位MCU采用293引脚FCCSP封装,工作频率最高可达800MHz。该微控制器专为需要结合处理和实时通信的工业应用而构建,例如远程I/O模块和电机驱动器。 核心处理器:ARM Cortex-M4F,ARM Cortex-R5F 内核规格&#xf…

pytest 禁用警告信息(忽略警告信息输出)

如图示例代码,提示test_001这个case 存在警告 新增pytest.ini 配置文件 [pytest] filterwarnings errorignore::UserWarning

携带时间戳主动写入数据到prometheus service(可乱序、go)

使用到的github公开项目 https://github.com/castai/promwrite Prometheus版本2.45.0 拉下来装依赖,然后使用 client_test.go t.Run(“write with custom options”, func(t *testing.T) 这个测试用例里面,删掉srv初始化的部分,这个是模拟一…

本地生活直播,和电商直播有什么不一样?

直播正在成为零售业的标配,当下最新的一条赛道是“本地生活直播”。 (商家开始在美团等平台进行本地生活直播。摄影:李崧稷) 今年618,在老牌电商平台拉着无数网店,拼尽全力想要堆高销量的时候,一…

微信小程序导入微信地址

获取用户收货地址。调起用户编辑收货地址原生界面,并在编辑完成后返回用户选择的地址。 1:原生微信小程序接口使用API:wx.chooseAddress(OBJECT) wx.chooseAddress({success (res) {console.log(res.userName)console.log(res.postalCode)c…

TensorFlow模块简介

TensorFLow框架内构建了很多高层次的API,可以显著减少编写程序的代码量,其中包含众多网络结构相关函数和数据载入、数据处理的方法。 tf.data.Dataset tf.data.Dataset是TensorFlow内置的数据输入模块,提供了专门用于数据输入的多种方法&am…