【MySQL】InnoDB引擎中的Compact行格式

目录

  • 1、背景
  • 2、数据示例
  • 3、Compact解释
    • 【1】组成
    • 【2】头部信息
    • 【3】隐藏列
    • 【4】数据列
  • 4、总结

1、背景

mysql中数据存储是存储引擎干的事,InnoDB存储引擎以页为单位存储数据,每个页的大小为16KB,平时我们操作数据库都是以行为单位进行增删改查,行数据是存储在页上的,行的格式有4种:Compat、Redundant、Dynamic、Compressed,今天我们来讲一下Compat行格式。

2、数据示例

我们建表语句中使用的varchar、text、blob等类型不确定长度的就使用了Compact行格式,为了方便理解我们手动创建一个表并且插入两条记录,后面都结合这两条记录来进行Compat行格式讲解,表和记录如下:
创建表

CREATE TABLE test_compact
(
    id INT AUTO_INCREMENT PRIMARY KEY,
    str1 VARCHAR(255) NOT NULL DEFAULT '',
    str2 VARCHAR(255),
    str3 CHAR(5)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 ROW_FORMAT=COMPACT;

插入数据

INSERT INTO test_compact (str1, str2, str3)
VALUES ('AA', 'BB', 'CCC'),
       ('AAA', NULL, NULL);

查看数据

mysql [xxx]> select * from test_compact;
+----+------+------+------+
| id | str1 | str2 | str3 |
+----+------+------+------+
|  1 | AA   | BB   | CCC  |
|  2 | AAA  | NULL | NULL |
+----+------+------+------+
2 rows in set (0.001 sec)

查看表的行格式

mysql [xxx]> show table  status like 'test_compact' \G;
*************************** 1. row ***************************
            Name: test_compact
          Engine: InnoDB
         Version: 10
      Row_format: Compact //目前表使用的行格式
            Rows: 2
  Avg_row_length: 8192
     Data_length: 16384
 Max_data_length: 0
    Index_length: 0
       Data_free: 0
  Auto_increment: 3
     Create_time: 2024-12-13 17:20:47
     Update_time: 2024-12-13 17:21:02
      Check_time: NULL
       Collation: utf8mb4_general_ci
        Checksum: NULL
  Create_options: row_format=COMPACT  //创建表时指定的格式
         Comment: 
Max_index_length: 0
       Temporary: N
1 row in set (0.001 sec)

3、Compact解释

【1】组成

Compact行格式组成图如下:

在这里插入图片描述
Compact行由头部信息+隐藏行+数据列三部分组成。

头部信息:由三部分组成,可变长度列的实际长度信息、列是否为NULL信息、描述记录信息。
隐藏列:有三列,DB_ROW_ID、DB_TRX_ID、DB_ROLL_PTR,后面详细讲解。
数据列:每一列的值。

【2】头部信息

头部信息可以如图表示:

在这插入图片描述

接下来就结合上面创建的test_compact表和插入的记录进行理解。
可变长度列指的就是表中的str1和str2字段,因为str1和str2长度不固定,所以需要额外花费空间来记录str1和str2的长度,str1和str2的值只有不为NULL的时候才需要记录长度,并且str1和str2长度的顺序是根据列顺序的逆序来存放。
存放str1和str2长度大小为1个或者2个字节,判断方法是:可变字段存储的最大字节>255字节并且真实存储的字节数>127字节就使用2个字节存储长度,否则使用1个字节存储长度。
可变字段存储的最大字节=varchar(n)里的n * 字符集的最大字节数。n代表的是字符数,而我们用的utf8mb4字符集1个字符用1~4个字节表示,可以用如下命令看:

mysql [xxx]> show charset like 'utf8mb4';
+---------+---------------+--------------------+--------+
| Charset | Description   | Default collation  | Maxlen |
+---------+---------------+--------------------+--------+
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci |      4 |
+---------+---------------+--------------------+--------+
1 row in set (0.001 sec)

可以看到utf8mb4可以表示的一个字符最大字节为4,所以str1和str2列可以存储的最大字节数为255 * 4 = 4080,ASCII字符只占用1个字节,第一条记录中的str1和str2实际长度都为2个字节。
同样的str3的类型为CHAR(5),根据字符集决定存它储字节的范围为5~20,所以str3的长度信息也需要进行存储。

第一条记录str3内容’CCC’长度看起来虽然为3,实际上长度为5,这是为了防止更新str3为大于3小于5的数据时,以前的空间就成为了空间碎片需要释放。

可以用下图表示上面2条记录长度的存储信息:

可以为NULL列表指的就是没有NOT NULL修饰的str2和str3列,用二进制的0和1来表示列是否为NULL值,0代表非NULL,1代表NULL,根据列的顺序逆序排列NULL信息,必须用二进制的整数倍来存储NULL信息,不足1字节高位补0,上面2条记录的NULL信息如下:

在这里插入图片描述
行记录描述信息是由5个字节也就是40个二进制位组成,不同位代表不同的含义,不做过多解释。

【3】隐藏列

InnoDB存储引擎会为每一行数据额外分配三个列:DB_ROW_ID、DB_TRX_ID、DB_ROLL_PTR,通过表格来理解一下:

隐藏列描述大小
DB_ROW_ID唯一标识6字节
DB_TRX_ID事务id6字节
DB_ROLL_PTR指向要回滚数据的地址7字节

DB_ROW_ID只有主键和unique健都不存在时,InnoDB存储引擎会创建一个大小为6字节作为隐藏主键id使用。

【4】数据列

数据列只需要注意值为NULL的列不需要再去花空间去存储,因为头部信息的NULL列表已经存储了是否为NULL,所以上面2条记录完整表示如下:

在这里插入图片描述

4、总结

本篇文章讲了Compact行格式组成,其它几种格式都差不多,Redundant会记录所有列的长度信息,通过相邻列的偏移量来计算列的长度;Dynamic、Compressed格式在行溢出(列数据过于大页面存不下)时列数据只存储其它页的地址,数据全存储在其它页通过链表连接;Compact和Redundant会在当前页存储一部分数据信息和在其它页的剩余数据地址。

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

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

相关文章

Visual Studio 玩转 IntelliCode AI辅助开发

🎀🎀🎀【AI辅助编程系列】🎀🎀🎀 Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…

【LDAP】LDAP概念和原理介绍

目录 一、前言 二、什么是LDAP? 2.1 什么是目录服务? 2.2 LDAP的介绍 2.3 为什么要使用LDAP 三、LDAP的主要产品线 四、LDAP的基本模型 4.1 目录树概念 4.2 LDAP常用关键字列表 4.3 objectClass介绍 五、JXplorer工具使用 一、前言 对于许多的…

用ue5打开网址链接

需要用到 Launch URL 这个函数 字面意思就是打开填写的链接网页 这里填写的是百度,按下Tab键后就会打开百度的网页

在ESP32使用AT指令集与服务器进行TCP/IP通信时,<link ID> 解释

在ESP32使用AT指令集与服务器进行TCP/IP通信时&#xff0c;<link ID> 是一个非常重要的参数。它用于标识不同的连接实例&#xff0c;特别是在多连接场景下&#xff08;如同时建立多个TCP或UDP连接&#xff09;。每个连接都有唯一的<link ID>&#xff0c;通过这个ID…

前后端跨域问题(CROS)

前端 在src中创建util文件&#xff0c;写request.js文件&#xff1a; request.js代码如下&#xff1a; import axios from axios import { ElMessage } from element-plus;const request axios.create({// baseURL: /api, // 注意&#xff01;&#xff01; 这里是全局统一加…

学习笔记071——Java中的【线程】

文章目录 1、基础2、进程和线程3、什么是多线程4、Java 中线程的使用5、Java 中创建线程的方式5.1、继承 Thread 类5.2、实现 Runnable 接口5.3、继承 Thread 和实现 Runnable 接口的区别5.4、实现 Runnable 接口的优化 6、线程的状态7、线程调度7.1、线程休眠7.2、线程合并7.3…

devops-部署Harbor实现私有Docker镜像仓库

文章目录 概述下载配置安装安装后生成的文件使用和维护Harbor参考资料 概述 Harbor是一个开源注册中心&#xff0c;它使用策略和基于角色的访问控制来保护工件&#xff0c;确保镜像被扫描并且没有漏洞&#xff0c;并将镜像签名为可信的。Harbor是CNCF的一个毕业项目&#xff0…

快速上手Neo4j图关系数据库

参考视频&#xff1a; 【IT老齐589】快速上手Neo4j网状关系图库 1 Neo4j简介 Neo4j是一个图数据库&#xff0c;是知识图谱的基础 在Neo4j中&#xff0c;数据的基本构建块包括&#xff1a; 节点(Nodes)关系(Relationships)属性(Properties)标签(Labels) 1.1 节点(Nodes) 节点…

Polkadot 11 月生态月报:3900万交易量、69%增长率,技术与社区齐头并进

原文&#xff1a;https://x.com/Polkadot/status/1865118662069490074 编译&#xff1a;OneBlock 上个月对 Polkadot 生态来说可谓是跌宕起伏&#xff0c;从创下交易记录到开创性合作&#xff0c;Polkadot 热度不断。展现出强大的技术实力和蓬勃发展的社区活力。在回顾本月亮点…

基坑表面位移沉降倾斜自动化监测 非接触式一体化解决机器视觉

基于变焦视觉位移监测仪的基坑自动化监测新方案是一种集成了光学、机械、电子、边缘计算、AI识别以及云平台软件等技术的自动化系统。该方案利用变焦机器视觉原理&#xff0c;结合特殊波段成像识别技术和无源靶标&#xff0c;实现了非接触式大空间、多断面、多测点的高精度水平…

CSS学习-第三天

css链接 链接样式&#xff0c;可以使用任何css属性 特别的样式&#xff0c;可以有不同的样式 a:link - 正常&#xff0c;未访问过的链接 a:visited - 用户已访问过的链接 a:hover - 当用户鼠标放在链接上时 a:active - 链接被点击的那一刻 a:hover必须跟在a:link和a:visited后…

电脑显示器选购指南2024

选择显示器是五花八门的显示参数&#xff0c;如何选择&#xff0c;以下给出参数说明&#xff0c;及部分参考&#xff1a; 1. 尺寸和分辨率 尺寸&#xff08;英寸&#xff09; 根据使用距离和用途选择合适的屏幕尺寸&#xff1a; 21-24 英寸&#xff1a;适合小桌面空间、日常…

快速掌握C语言——数据结构【创建顺序表】多文件编译

1.数据结构脑图&#xff08;未完&#xff09; 2.顺序表其他操作 3.功能函数封装 4 完整代码 1>头文件test.h #ifndef __TEST_H__ #define __TEST_H__#include<stdlib.h> #include<stdio.h> #include<string.h>//宏定义 线性表的最大容量 #define MAX 3…

Linux 中的 mkdir 命令:深入解析

在 Linux 系统中&#xff0c;mkdir 命令用于创建目录。它是文件系统管理中最基础的命令之一&#xff0c;广泛应用于日常操作和系统管理中。本文将深入探讨 mkdir 命令的功能、使用场景、高级技巧&#xff0c;并结合 GNU Coreutils 的源码进行详细分析。 1. mkdir 命令的基本用法…

STM32F407+LAN8720A +LWIP +FreeRTOS UDP通讯

STM32F407+LAN8720A +LWIP +FreeRTOS ping通 上一篇实现了LWIP ping 通 本篇实现UDP通讯 实现如下功能: 串口1空闲中断+DMA接收,收到数据用UDP发送UDP接收,收到数据用串口1发送STM32CUBEIDE配置和代码 1. 配置UARAT1的空闲中断+DMA接收 UART1接收到数据,释放信号量,在任…

【蓝桥杯选拔赛真题94】Scratch巡逻的直升机 第十五届蓝桥杯scratch图形化编程 少儿编程创意编程选拔赛真题解析

目录 scratch巡逻的直升机 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、python资料 sc…

非前后端分离项目,通过拦截器,对前端发送网络访问地址

一、背景 在非前后端分离的web应用开发过程中&#xff0c;在html中不可避免的需要请求项目地址去访问接口或者静态资源&#xff0c;但是开发环境、测试环境以及生产环境不同&#xff0c;地址也不同&#xff0c;避免频繁修改代码&#xff0c;可以通过自动获取访问地址通过拦截器…

人工智能大语言模型起源篇(一),从哪里开始

序言&#xff1a;许多人最初接触人工智能都是在ChatGPT火热之际&#xff0c;并且大多停留在应用层面。对于希望了解其技术根源的人来说&#xff0c;往往难以找到方向。因此&#xff0c;我们编写了《人工智能大语言模型起源篇》&#xff0c;旨在帮助读者找到正确的学习路径&…

FFmpeg功能使用

步骤&#xff1a;1&#xff0c;安装FFmpeg Download FFmpeg 在这里点击->Windows builds from gyan.dev&#xff1b;如下图 会跳到另外的下载界面&#xff1a; 在里面下拉选择点击ffmpeg-7.1-essentials_build.zip&#xff1a; 即可下载到FFmpeg&#xff1b; 使用&#…

【Unity基础】Unity中如何实现图形倒计时

为了在Unity中实现一个图形倒计时&#xff0c;除了代码部分&#xff0c;还需要一些UI元素的创建和设置。本文以环形倒计时为例&#xff0c;以下是完整的步骤&#xff0c;涵盖了如何创建UI元素、设置它们&#xff0c;以及如何编写控制环形倒计时进度的脚本。 1. 创建UI元素 创建…