当前位置: 首页 > news >正文

【MySQL进阶之路 | 高级篇】InnoDB搜索引擎行格式

1. COMPACT行格式

COMPACT行格式是MySQL5.1的默认行格式.其结构示意图如下.

f1d1fc7c0c0643c0803d555be1e43332.png

大体可以分为两部分.

  • 记录的额外信息.这里面有包括变长字段长度列表,NULL值列表和记录头信息.
  • 记录的真实数据.

(1).变长字段长度列表

MySQL支持一些变长的数据类型.比如VARCHAR(m), VARBINARY(n), TEXT类型.这些数据类型修饰的列称为变长字段.变长字段中存储多少字节的数据不是固定的,所以我们在存储数据的时候也顺便把这些数据占用的字节数也存储起来.在COMPACT行格式中,把所有变长字段的真实数据占用的字节数都存放在记录的开头部位,从而形成变长字段长度列表.

这里存储的变长字段长度和字段顺序是反过来的.比如此处应该存放为060408.

CREATE TABLE compact_demo(
c1 VARCHAR(8),
c2 VARCHAR(8),
c3 CHAR(8),
c4 VARCHAR(8)
) charset=ascii ROW_FORMAT=COMPACT;INSERT INTO compact_demo
VALUES('zhangsan', 'lisi', 'wang5', 'ding1');

b23c63c65b0f4892947bd4d16e8b8b1a.png

(2). NULL值列表

compact格式会把可以为null值的列统一管理起来,存放在一个标记为null值的列表中.如果表中没有允许存储null值的列,则null值列表也就不存在了.

之所以要存储null值,是因为数据是需要对齐的.如果没有表明出来null值的位置,就有可能查询数据的时候发生混乱.如果使用一个特定的符号放到相应数据位表示null值的话,会很浪费空间,所以干脆直接在行数据开头开辟一处空间专门用来记录该行记录哪些是空数据,哪些是非空.

二进制位为1时,该列的值为null.为0时则该列的值为非空.

如果某字段明确了是非空的(比如NOT NULL/PRIMARY KEY),那么null值列表就不管这些字段了.

(3).记录头信息

记录头信息占有5个字节大小.用于描述记录的一些属性.

147c91ca8c9947a3a951edfc4e3fc39f.png

1. 删除标记位(Delete Flag):占1位,表示记录是否被标记为删除。在InnoDB中,记录被删除时并不是立即物理删除,而是通过设置这个标志位来标记记录为已删除,这样可以快速“删除”记录且不影响后续的插入操作。2. 最小记录标记位(Min Record Marker):占1位,仅在页内最小记录上设置为1,表明这是页内用户记录中的最小记录。3. 最大记录标记位(Max Record Marker):占1位,仅在页内最大记录上设置为1,表明这是页内用户记录中的最大记录。4. heap_no:占4位,表示记录在页内的堆编号,用于标识记录在页中插入的顺序。5. next_record:占16位或24位(取决于行格式),记录指向下一个记录的指针,用于遍历页内的记录链表。在Compact和Redundant行格式中通常是16位,在DYNAMIC和COMPRESSED行格式中可能使用24位以适应更大的页大小。6. n_owned:占4位,在B+树的非叶节点中,表示子页的数量;在聚集索引的叶节点中,表示指向同一行的辅助索引记录数量。7. record type:占3位,表示记录类型,常见的有:- 0:普通用户记录。- 1:目录项记录,用于B+树的内部节点。- 2:最小记录(Infimum)- 3: 最大记录(Supremum),这两个特殊的记录用来界定用户记录的边界,不存储实际用户数据。

这些字段的作用以后细谈.

(4). 记录的真实数据

记录的真实数据除了我们自己定义的列的数据外,还有三个隐藏列.

b51d6aeed5c54f9e81198bec49187a71.png

这些列的真实名称其实是 : DB_ROW_ID, DB_TRX_ID, DB_ROLL_PTR.

值得注意的是,除了第一个row_id,其他两个都是必须的.这是为什么呢?

原因我们讲过,创建聚簇索引时,我们优先选择用户自定义的主键作为主键,如果无,则会选择一个非空且唯一键作为主键,如果无,那么InnoDB会为表默认添加一个名为row_id的列作为隐藏列作为主键.

2. DYNAMIC/COMPRESSED行格式

MySQL5.7和8.0默认的行格式都是dynamic.

这两个行格式只有在行溢出这种情况下,有所区别,简单介绍一下行格式.

我们知道一个页的大小一般是16kb.也就是16384字节.而一个类型为varchar(m)的列最多可以存储65533个字节.这样就可能出现了一个页存放不下一条记录.这种情况叫行溢出.

  • 在COMPACT/REDUNTANT行格式中,对于占用存储空间非常大的列,在记录的真实数据处只会存储该列的一部分数据,把其他剩余数据分散存储在几个其他的页中进行分页存储.然后记录的真实数据用20个字节存储指向这些页的地址.从而可以找到剩余数据所在的页.
  • 在DYNAMIC/COMPRESSED行格式中,对于存放在blog中的数据采用了完全行溢出的方式.比如在数据页中只存放20个字节的地址,实际数据都放在溢出页中.

相关文章:

【MySQL进阶之路 | 高级篇】InnoDB搜索引擎行格式

1. COMPACT行格式 COMPACT行格式是MySQL5.1的默认行格式.其结构示意图如下. 大体可以分为两部分. 记录的额外信息.这里面有包括变长字段长度列表,NULL值列表和记录头信息.记录的真实数据. (1).变长字段长度列表 MySQL支持一些变长的数据类型.比如VARCHAR(m), VA…...

大数据面试-Scala

谈谈scala的闭包、柯里化、高阶函数 如果一个函数,访问到了它的外部(局部)变量的值,那么这个函数和他所处的环境,称为闭包。 闭包在函数式编程中是一个重要的概念,广泛用于高阶函数、柯里化等技术中。 函数…...

76.最小覆盖子串

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 如果 s 中存…...

深度学习算法informer(时序预测)(三)(Encoder)

一、EncoderLayer架构如图(不改变输入形状) 二、ConvLayer架构如图(输入形状中特征维度减半) 三、Encoder整体 包括三部分 1. 多层EncoderLayer 2. 多层ConvLayer 3. 层归一化 代码如下 class AttentionLayer(nn.Module):de…...

HTML和CSS基础(一)

前言 HTML(HyperText Markup Language)是一种用于创建网页的标准标记语言。它由各种标签组成,这些标签定义了网页的结构和内容。HTML的早期形式诞生于1989年,由CERN的物理学家Tim Berners-Lee发明,最初用于在科学家之…...

低代码平台教你两步把SQL直接转换为RESTful API

文章目录 前言一、简介1. 项目亮点2. 技术栈3. 核心功能4. 数据库设计二、搭建教程1. 目录结构2. 下载2.1 下载2.2 上传2.3 解压3. 配置3.1 创建并切换数据库3.2 执行sql文件3.3 修改配置文件4. 启动/停止4.1 启动4.2 停止4.3 重启5. 浏览器访问三、配置教程1. 数据源配置1.1 创…...

JavaWeb阶段学习知识点(二)

登录校验和JWT令牌实现 JWT使用方式 创建一个springboot项目,pom.xml引入jwt依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency><!-- 针对jdk17或…...

数据结构【二叉树】

前言 我们在前面学习了使用数组来实现二叉树&#xff0c;但是数组实现二叉树仅适用于完全二叉树&#xff08;非完全二叉树会有空间浪费&#xff09;&#xff0c;所以我们本章讲解的是链式二叉树&#xff0c;但由于学习二叉树的操作需要有一颗树&#xff0c;才能学习相关的基本…...

Vue P17-54

18、计算属性 示例&#xff1a;实现姓名的联动效果 可以用插值语法、method {{func()}} 这里必须有 &#xff08;&#xff09;表示返回值 在事件处理中&#xff0c;click“func1” 有没有无所谓 computed的计算属性和data中的属性都在vm中&#xff0c;但vm._data里只有后者…...

【自动驾驶】从零开始做自动驾驶小车

文章目录 自动驾驶小车系统、运动底盘的运动学分析和串口通信控制电机PID控制IMU初始化与陀螺仪零点漂移ubuntu基础教程ROS基础键盘控制巡线(雷达避障)雷达跟随视觉跟踪2D建图、2D导航3D建图、3D导航纯视觉建图导航语音控制KCF跟随自主建图建图与导航多机编队WEB浏览器显示摄像…...

一文让你彻底搞懂什么是VR、AR、AV、MR

随着科技的飞速发展&#xff0c;现实世界与虚拟世界的界限变得越来越模糊。各种与现实增强相关的技术如雨后春笋般涌现&#xff0c;令人眼花缭乱。本文将为你详细解读四种常见的现实增强技术&#xff1a;虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff0…...

Python设计模式 - 简单工厂模式

定义 简单工厂模式是一种创建型设计模式&#xff0c;它通过一个工厂类来创建对象&#xff0c;而不是通过客户端直接实例化对象。 结构 工厂类&#xff08;Factory&#xff09;&#xff1a;负责创建对象的实例。工厂类通常包含一个方法&#xff0c;根据输入参数的不同创建并返…...

L55--- 257.二叉树的所有路径(深搜)---Java版

1.题目描述 2.思路 &#xff08;1&#xff09;因为是求二叉树的所有路径 &#xff08;2&#xff09;然后是带固定格式的 所以我们要把每个节点的整数数值换成字符串数值 &#xff08;3&#xff09;首先先考虑根节点&#xff0c;也就是要满足节点不为空 返回递归的形式dfs(根节…...

智慧园区解决方案PPT(53页)

## 1.1 智慧园区背景及需求分析 - 智慧园区的发展历程包括园区规划、经济、产业、企业、管理、理念的转变&#xff0c;强调管理模式创新&#xff0c;关注业务综合化、管理智慧化等发展。 ## 1.2 国家对智慧园区发展的政策 - 涉及多个国家部门&#xff0c;如工信部、住建部、…...

Windows安装MySQL(8.0.37)

安装&#xff1a;https://blog.csdn.net/XLBYYDS/article/details/139711682 注意点&#xff1a; &#xff08;1&#xff09;必须安装到C盘系统盘&#xff0c;否则执行 net start mysql 启动服务时&#xff0c;可能会启动失败。 &#xff08;2&#xff09;如果安装时出现 The…...

永磁同步电机驱动死区补偿

1 死区效应及补偿 1. 1 死区效应 在本文的电机控制嵌入式系统中,逆变器为三 相电压型桥式逆变电路,如图 1 所示。 在理想状态 下,上桥臂和下桥臂的控制信号满足互补通断原则, 即上桥臂开通时,下桥臂关断,反之亦然。 而在实际 应用中,开关管的通断需要一定的开通时…...

智能体合集

海外版coze: 前端代码助手 后端代码助手&#xff1a; 前端代码助手&#xff1a;...

智能农业管理系统设计

一、引言 随着物联网、云计算和大数据技术的快速发展&#xff0c;智能农业管理系统成为提高农业生产效率、优化资源配置、降低环境污染的重要手段。本设计旨在构建一个集数据采集、传输、处理、分析于一体的智能农业管理系统&#xff0c;为农业生产提供全方位、精准化的服务。 …...

Matlab的Simulink系统仿真(simulink调用m函数)

这几天要用Simulink做一个小东西&#xff0c;所以在网上现学现卖&#xff0c;加油&#xff01; 起初的入门是看这篇文章MATLAB 之 Simulink 操作基础和系统仿真模型的建立_matlab仿真模型搭建-CSDN博客 写的很不错 后面我想在simulink中调用m文件 在 Simulink 中调用 MATLA…...

C语言中操作符详解(一)

众所周知&#xff0c;在我们的C语言中有着各式各样的操作符&#xff0c;并且在此之前呢&#xff0c;我们已经认识并运用了许许多多的操作符&#xff0c;都是诸君的老朋友了昂 操作符作为我们使用C语言的一个非常非常非常重要的工具&#xff0c;诸君一定要加以重视&#xff0c;…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...