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

news2024/11/26 9:49:12

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.coloradmin.cn/o/771383.html

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

相关文章

Small Tip: 怎么找S4HANA所有的CDS View 以及跟BW相关的CDS View

1. 网页上找 1. SAP Business Accelerator Hub 到网址:https://api.sap.com 2. 到Categories底下找。如果没看见CDS View就去View all categories 3. 找到CDS Views之后,点击进去。 4. 按Package 分类来找: 2. 去help.sap.com找SAP S/4HA…

物理机传输大文件到虚拟机

物理机快速传输大文件到虚拟机 测试使用Tabby传输大文件到虚拟机 1.1 准备大文件 1.2 通过Tabby上传文件到Linux 总耗时约:7分钟 1.3 通过EveryThing配置服务 打开EveryThing,点击工具—> 选项—>http服务器 启用HTTP服务器,配置…

【基于 GitLab 的 CI/CD 实践】05、GitLab Pipeline 实践(下)

目录 needs 并行阶段 制品下载 include local 引入本地配置 file 引入其他项目配置 template 引入官方配置 remote 引入远程配置 extends 继承作业配置 extends & include trigger 管道触发 多项目管道 父子管道 image 准备环境 services environment inh…

文心一言 VS 讯飞星火 VS chatgpt (63)-- 算法导论6.5 2题

文心一言 VS 讯飞星火 VS chatgpt (63)-- 算法导论6.5 2题 二、试说明 MAX-HEAP-INSERT(A,10)在堆A(15,13,9,5,12,8,7,4,0,6&#xf…

XR应用云流化,多方面提升 XR 扩展现实体验!

无论是使用户能够协作设计电动赛车,还是帮助观众通过数字世界与自然互动,越来越多的企业利用XR扩展现实为用户提供沉浸式逼真的虚拟环境。 下一代沉浸式技术的应用越来越广泛,图形和人工智能的最新突破正在扩展XR的功能。这四种技术正在XR生态…

网络安全在2023好入行吗?

前言 023年的今天,慎重进入网安行业吧,目前来说信息安全方向的就业对于学历的容忍度比软件开发要大得多,还有很多高中被挖过来的大佬。 理由很简单,目前来说,信息安全的圈子人少,985、211院校很多都才建…

K12351 生日日期

题目描述 小科的生日是YY年MM月DD日,他想知道自己出生第10000天纪念的日期,出生日算第0天 输入格式 输入三个整数,分别表示YY,MM,DD,其中 1949≤YY≤2016 输出格式 输出小科身体第一万天以后的日期,格式为YY-MM-DD 输入输出…

Jmeter+Maven+jenkins+eclipse搭建自动化测试平台

背景: 首先用jmeter录制或者书写性能测试的脚本,用maven添加相关依赖,把性能测试的代码提交到github,在jenkins配置git下载性能测试的代码,配置运行脚本和测试报告,配置运行失败自动发邮件通知&#xff0c…

Docker 基本管理与应用

目录 一、Docker介绍 1、docker概述 2、容器优势 3、Docker与虚拟机的区别 4、Docker核心概念 二: 安装 Docker 1、环境准备、安装依赖包 2、 设置阿里云镜像源,安装 Docker-CE并设置为开机自动启动 3、信息查看 ​三:Docker 镜像操作…

AHB协议理解

目录 Chapter1 AHB Block Diagram Ginput signal lnput signals Output Signal Chapter3 Transfers AHB接口Overview Chapter6 Data Buses HWDATA HRDATA Chapter1 Introduction AHB: Advanced High-performance Bus ( 高级高性能总线 ) 应用场景:针对高效率&#…

cancal报错 config dir not found

替换classpath中间封号两边的值

这款录音转文字工具让你的录音转写更加便捷

小明:小李,最近我一直在做一个听力练习,但是听力材料都是录音,手动转写真的好慢,有什么办法可以提高录音转写效率吗? 小李:当然有啦!我之前也遇到过这种情况,最后我是通…

边缘检测之loG算子

note // 边缘检测之loG算子:对高斯函数求二阶导数 // G(x,y) exp(-1 * (x*x y*y) / 2 / sigma / sigma) // loG(x,y) ((x*x y*y - 2 * sigma * sigma) / (sigma^4)) * exp(-1 * (x*x y*y) / 2 / sigma /sigma) /* [ 0,0,-1,0,0; 0,-1,-2,-1,0; -1,-2,16,-2…

『红外图像 数据增强』DDE(Digital Detail Enhancement)算法

DDE处理的细节 分离背景层和细节层:使用特殊的滤波器,将图像分成背景层和细节层。背景层通常包含低频信息,而细节层包含高频信息。 对背景层进行灰度增强:通过对背景层应用适当的灰度增强算法,提高背景层的对比度和视…

数据结构(王道)——数据结构之 二叉树的存储结构

一、顺序存储 静态顺序存储 顺序存储的二叉树结构特性: 顺序存储的非完全二叉树特性 不完全二叉树的可能会浪费大量空间,所以一般顺序存储二叉树比较少用。 图示为什么很少用顺序存储来存二叉树 顺序存储的二叉树总结: 二、链式存储 二叉链表…

MYSQL数据库-数据库的学习

MYSQL数据库-数据库的学习 MYSQL数据库一、数据库的基本概念二、常见的数据库三、MySQL数据库四、SQL操作五、SQL高级操作六、SQL函数(SQL 拥有很多可用于计数和计算的内建函数) MYSQL数据库 一、数据库的基本概念 1、数据库的英文单词:DataBase 简称 : DB 2、什么…

浙大数据结构第四周之04-树6 Complete Binary Search Tree

题目详情: A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the nodes key.The right subtree of a node contains only nodes w…

2023软件测试八股文,拿下满意的offer就靠这了

前言 2023年软件测试行业就业越来越严峻,金三银四也成了铜三铁四,内卷成为了软件测试领域的代名词。 深圳,我的一个HR朋友告诉我,软件测试由于门槛低,现在普通测试岗(偏功能)的投递太多了&…

如何把本地项目的代码上传到 GitHub 上(详解)

此教程适用于已经安装 git ,并且已经注册 GitHub 账号的电脑,如果没有下载 git ,或者还没有注册过 GitHub 账号的,可以找相关教程弄一下。下面直接开整 说明:这里的案例就用我之前写的一个前端页面(内蒙古招…

04 QT坐标系

在QT中默认左上角为原点,即(0,0)点。x轴右侧为正方向,y轴以下侧为正方向