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

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

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

相关文章

(1)ADS-B接收机

文章目录 前言 1.1 所需硬件 1.2 连接到自动驾驶仪 1.3 设置 1.4 ADSB输出配置 1.5 启用载人飞行器避障功能 1.6 飞行器数据库 1.7 开发者信息包括模拟 前言 本文介绍了如何安装和配置 ADS-B 模块,以便你的飞机能够知道附近的其他飞机和空中交通管制&#x…

CSS样式

1.高度和宽度 .c1{height:300px;width:500px;}注意事项: 宽度支持百分比,高度不支持。行内标签:默认无效会计标签:默认有效(霸道,右侧区域空白,也不给你用) 2.块级和行内标签 块…

微服务架构+创建微服务工程(商品/订单)

目录 1.微服务架构 1.1.单体应用架构 1.2.微服务应用 1.3 微服务架构的优势 1.4.微服务架构的缺点(挑战) 1.5. SpringCloud与微服务关系 1.6.SpringBoot和SpringCloud关系 2. 创建微服务工程 2.1.数据库 2.2.搭建父工程 2.2 创建公共模块 2.3.商品系统 2.4.订单微…

Linux/Unix-gcc编译回顾

1、gcc编译为可执行程序四步骤:预处理->编译->汇编->链接 注意:-o 用于修改生产的文件名 2、gcc常用参数 指定头文件:-I 语法: gcc -I 头文件所在文件夹路径 源文件 -o 生成文件名 如果头文件和源文件中同一个文件夹…

Docker 常用命令

docker命令大全 命令说明docker attach将本地标准输入、输出和错误流附加到正在运行的容器docker build从 Dockerfile 构建镜像docker builder管理构建docker checkpoint管理检查点docker commit从容器的更改中创建新图像docker config管理 Docker 配置docker container管理容器…

GOPATH、GOROOT(VSCode编写第一个go程序)

1. GOROOT和GOPATH GOROOT 和 GOPATH 都是 Go 语言中的环境变量,用于指定 Go 工具链和工作区的路径。 GOROOT 指定了 Go 工具链的安装路径,它包含了 Go 语言的标准库、编译器等工具。在使用 Go 编译器、运行时等工具时,它们会默认从 GOROOT…

新晋 Committer!来自复旦大学的帅哥一枚

点亮Star⭐️ 支持我们 https://github.com/apache/dolphinscheduler 最近,社区星力量又迎来一位新晋 Committer,这次是来自复旦大学研究生在读的王维饶同学,一起来认识一下吧! 个人简介 姓名:王维饶职位&#xff1a…

SignalTap II 软件使用步骤

文章目录 前言一、SignalTap II是什么?二、使用步骤三、总结四、参考资料 前言 环境: 1、Quartus18.1 2、板子型号:原子哥开拓者2(EP4CE10F17C8) 要求: 能够使用SignalTap II进行片上调试。 一、SignalTap II是什么? S…

华为云子网路由表作用及价值

子网路由表 子网路由表作用云专线、VPN的配置与子网路由表强关联,本质是在相应的子网路由表中添加了一条路由Nat路由表问题地址变更问题snat和dnat 子网路由表作用 子网内部作为一个二层网络,通过mac地址互通,不通过路由互通。跨子网&#x…

ASUS华硕ROG幻14 2021款GA401QM原厂Win10系统工厂模式带ASUS Recovery恢复功能

自带恢复分区、所有驱动、出厂主题壁纸LOGO、Office办公软件、奥创控制中心等预装程序 所需要工具:16G或以上的U盘(非必需) 文件格式:HDI,SWP,OFS,EDN,KIT,TLK多个底包 文件大小:11.34GB 注:恢复时会清空电脑上所有盘的数据&…

【布局优化】基于遗传算法的车间布局优化 车间设施布局优化【Matlab代码#50】

文章目录 【获取资源请见文章第5节:资源获取】1. 车间布局优化2. 基于GA的布局优化模型3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节:资源获取】 1. 车间布局优化 车间设施布置的规划一直是工业工程领域不断研究和探索的内容&am…

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

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

[javascript核心-08] V8 内存管理机制及性能优化

V8 内存管理 V8 本身也是程序,它本身也会申请内存,它申请的内存称为常驻内存,而它又将内存分为堆和栈 栈内存 栈内存介绍 栈用于存放JS 中的基本类型和引用类型指针栈空间是连续的,增加删除只需要移动指针,操作速度…

leetcode100.相同的树

⭐️ 题目描述 🌟 leetcode链接:相同的树 1️⃣ 代码: bool isSameTree(struct TreeNode* p, struct TreeNode* q){// 判断两棵树当前结点是否为空if (p NULL && q NULL) {// 说明是相同的return true;}// 来到这里有几种情况// …

单片机第一季:零基础6——按键

目录 1,独立按键 2,矩阵按键 (注意:文章中的代码仅供参考学习,实际使用时要根据需要修改) 1,独立按键 按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态&#xf…

集群基础3——haproxy负载均衡apache

文章目录 一、环境说明二、安装配置httpd三、安装配置haproxy四、验证http负载均衡五、配置https负载均衡六、haproxy网页监控6.1 监控参数详解6.2 页面操作 一、环境说明 使用haproxy对apache进行负载均衡。 主机IP角色安装服务192.168.161.131后端服务器1httpd,80端口192.168…

前端 | (五)CSS三大特性及常用属性 | 尚硅谷前端html+css零基础教程2023最新

学习来源:尚硅谷前端htmlcss零基础教程,2023最新前端开发html5css3视频 文章目录 📚CSS三大属性🐇层叠性🐇继承性🐇优先级 📚CSS常用属性🐇像素的概念🐇颜色的表示⭐️表…

【数据挖掘】如何为可视化准备数据

一、说明 想要开始您的下一个数据可视化项目吗?首先与数据清理友好。数据清理是任何数据管道中的重要步骤,可将原始的“脏”数据输入转换为更可靠、相关和简洁的数据输入。诸如Tableau Prep或Alteryx之类的数据准备工具就是为此目的而创建的,…

Android 开发规范(基础版)

背景 项目的代码时间时间很长,经过太多人手,代码的规范性堪忧,目前存在较多的比较自由的「代码规范」,这非常不利于项目的维护,代码可读性也不够高。 分析现有项目的代码的情况,输出的『定制化规范』文档,用于提高代码的可读性和可维护性。 收益 对于个人:帮助团队写「…

IIS 日志分析

Microsoft互联网信息服务(IIS)服务器,包括Web和FTP,已成为企业必不可少的。但是,IT 安全管理员的工作并不仅仅局限于部署 IIS 服务器。部署后,管理员必须采取安全措施来保护这些服务器。监视 IIS 服务器安全…