InnoDB详解2

news2025/1/16 8:12:15

文章目录

  • InnoDB详解2
  • 1 行格式
      • 1 Compact行格式详解
        • 1 变长字段长度列表(两个字节)
        • 2 NULL值列表(1个字节)
        • 3 记录头信息 (重点)
      • 2 Dynamic行格式
  • 2 页的上层结构

InnoDB详解2

1 行格式

规定每条记录是怎么存储的
MySQL 8默认行格式是Dynamic

InnoDB存储引擎设计了4种不同类型的`行格式`,分别是`Compact`、`Redundant`、`Dynamic`和`Compressed`行格式。
查看MySQL8的默认行格式:
mysql> SELECT @@innodb_default_row_format;
+-------------------------------------+
| @@innodb_default_row_format |
+-------------------------------------+
| dynamic                                   |
+-------------------------------------+
1 row in set (0.00 sec)
也可以使用如下语法查看具体表使用的行格式:
SHOW TABLE STATUS like '表名'\G

1 Compact行格式详解

image-20221223101452542

1 变长字段长度列表(两个字节)

在每条记录开始存入变长字段列表。没有变长字段就没有该项。小端存储。

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

image-20221223101918763

2 NULL值列表(1个字节)

为什么定义NULL值列表?

之所以要存储NULL是因为数据都是需要对齐的,如果没有标注出来NULL值的位置,就有可能在查询数据的时候出现混乱。如果使用一个特定的符号放到相应的数据位表示空置的话,虽然能达到效果,但是这样很浪费空间,所以直接就在行数据得头部开辟出一块空间专门用来记录该行数据哪些是非空数据,哪些是空数据

用于标识哪些是null值,1位null ,0不为null。允许为null的字段才会有该记录。

明确表明该字段不为null值时,不会记录

如 一条记录 有 ABC 三个字段 A是主键 BC可以为null 该记录 A = 1 ,B= null ,C = 2, NULL值列表存的是 0 1 ,0表示C不是null,1表示 B是null。A是主键不能为null 所以不用存。

3 记录头信息 (重点)

image-20221223103105152

image-20221223103153625

image-20221223104814392

delete_mask:当删除数据时,只需要将delete_mask标识位1。

占用1个二进制位。

  • 值为0:代表记录并没有被删除

  • 值为1:代表记录被删除掉了

被删除的记录为什么还在页中存储呢?

这些被删除的记录之所以不立即从磁盘上移除,是因为移除它们之后其他的记录在磁盘上需要重新排列,导致性能消耗。所以只是打一个删除标记而已,所有被删除掉的记录都会组成一个所谓的垃圾链表,在这个链表中的记录占用的空间称之为可重用空间,之后如果有新记录插入到表中的话,可能把这些被删除的记录占用的存储空间覆盖掉。

min_rec_mask:B+树的每层非叶子节点中的最小记录都会添加该标记,min_rec_mask值为1。

record_type:

这个属性表示当前记录的类型,一共有4种类型的记录:

0:表示普通记录

1:表示B+树非叶节点记录

2:表示最小记录

3:表示最大记录

heap_no:每条记录在此页中的位置,(Infimum )最小记录和(Supremum)最大记录的heap_no值分别是0和1,其他记录往后顺延。

**n_owned :**页目录中每个组中最后一条记录的头信息中会存储该组一共有多少条记录,作为 n_owned 字段。分组也叫slot槽,槽位记录的是最大记录的地址偏移,最后一条记录记录该组中有几条记录。

**next_record:**从当前记录的真实数据到下一条记录的真实数据的地址偏移量

image-20221223110220833

删除操作

image-20221223110429030

删除第二条记录时,先根据页目录二分查找到 槽位,然后进行遍历,遍历到第二条记录,delete_mask改为1,next_record改为0,第一条记录链接到第三条记录。该分组中 最后一条记录的n_owned由5变为4 (最小记录自成一组)

当数据页中存在多条被删除掉的记录时,这些记录的next_record属性将会把这些被删除掉的记录组成一个垃圾链表,以备之后重用这部分存储空间。

所以,不论我们怎么对页中的记录做增删改操作,InnoDB始终会维护一条记录的单链表,链表中的各个节点是按照主键值由小到大的顺序连接起来的

添加操作

image-20221223111331148

2 Dynamic行格式

MySQL对一条记录占用的最大存储空间是有限制的,除BLOB或者TEXT类型的列之外, 其他所有的列(不包括隐藏列和记录头信息)占用的字节长度加起来不能超过65535个字节。

这个65535个字节除了列本身的数据之外,还包括一些其他的数据,以Compact行格式为例,比如说我们为了存储一个VARCHAR(M)类型的列,除了真实数据占有空间以外,还需要记录的额外信息。

如果该VARCHAR类型的列没有NOT NULL属性,那最多只能存储65532个字节的数据,因为变长字段的长度占用 2个字节,NULL值标识需要占用1个字节。

CREATE TABLE varchar_size_demo(

c VARCHAR(65532)

) CHARSET=ascii ROW_FORMAT=Compact;

如果有not null属性,那么就不需要NULL值标识,也就可以多存储一个字节,即65533个字节

我们可以知道一个页的大小一般是16KB,也就是16384字节,而一个VARCHAR(M)类型的列就最多可以存储65533个字节,这样就可能出现一个页存放不了一条记录,这种现象称为行溢出

CompactReduntant行格式中,存不下的数据就存一部分数据和其他数据的页地址,其他数据放到其他页中。

CompressedDynamic两种记录格式对于存放在BLOB中的数据采用了完全的行溢出的方式。如图,在数据页中只存放20个字节的指针(溢出页的地址),实际的数据都存放在Off Page(溢出页)中。

image-20221223112438374

所以 Dynamic 与Compact的区别就是对行溢出处理不一样,dynamic只存溢出页的地址,compact还存了一部分数据。

2 页的上层结构

image-20221223112830884

​ 页中由一条条行记录构成,我们知道页之间是由双向链表连接的。如果连续的两个页之间真实地址相隔很远。磁盘寻道扫描速度很慢,

如果一个查询需要用到100个数据页,最坏情况下需要磁盘扫描100次。为了减少IO次数,所以有了区的概念

image-20221223113332702

在数据扫描时,要先获取非叶子节点,如果将叶子节点与非叶子节点存放到一个区中,我们要的是叶子节点的数据,此时这个区中叶子节点数据很少,大部分是非叶子节点,获取真实数据时,还要扫描其他区,为了避免这种情况,引入了段的概念

image-20221223113902661

也就是将叶子节点数据放到一个区中,非叶子节点放到一个区中,专门存叶子节点或者专门存非叶子节点的区就叫做段,创建一个索引时就会分配2个段。

表空间是一个逻辑概念。

碎片区

此时创建一个表,插入一条数据。若按照 区,段的划分,此时一条数据就要构建一个聚簇索引 要分配两个区。需要 16k * 64 * 2 = 2M的空间。(一个页16K,一个区有64页,索引有叶子节点与非叶子节点 要两个段)很浪费空间。

就引入了碎片区的概念

碎片区属于表空间,该碎片去可以存段A的数据,也可以存段B的数据,就是什么都能存。

所以新建表的空间分配策略是,先找个碎片区分配空间,当一个表占用32个碎片区页面后,就会申请完整的区来存储数据。

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

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

相关文章

汽车租赁服务小程序开发, 新时代下的行业商机

随着我国经济水平的提升,群众生活水平不断改善,人们的出行方式也发生了非常大的变化,不再依赖传统的出行方式,而是将目光转移到汽车上,作为当下便捷的出行方式之一,在面对远程旅游时却显得有些吃力&#xf…

React扩展:fragment、Context

目录 1.fragment fragment标签能包裹其它标签&#xff0c;但最后不会渲染到DOM树上。 import React, { Component, Fragment } from reactexport default class Demo extends Component {render() {return (<Fragment><input type"text" /><input …

Stealth-Persist混合内存系统中持久应用程序的体系结构支持

文章目录crash-consistent applications 崩溃一致性程序摘要一、引言二、背景A.新兴的非易失性存储器B.混合主存储器(HMM)C.页面缓存策略D. 目前的工业HMM系统E. 持久性内存编程模式F.动机三、设计A.设计要求B.设计选项C.Stealth-PersistD.概述E. Stealth-Persist NVM库的比较四…

如何用DWDM射频光纤技术实现200公里外的站点分集

本文概述了大型卫星和数据通信服务提供商如何通过使用DWDM射频光纤解决方案为Ka波段卫星数据传输实施经济高效的位置分集天线安装。 什么是DWDM技术? DWDM是Dense Wavelength Division Multiplexing的缩写&#xff0c;即密集波分复用技术&#xff0c;指的是一种光纤数据传输技…

pytest-需要模块相应的库

1. pytest-需要模块相应的库 文章地址&#xff1a;http://www.pythonck.com/archives/docs/1-2/13-2/13002-2 http://www.pythonck.com/archives/docs/1-2/13-2/13002-2 pytest-断言、跳过及运行 三元表达式&#xff1a;三元表达式又称三目运算符。在python中并没有三元表达式…

数商云SRM供应商系统打造家居建材企业完整电商数据生态平台

随着5G、物联网、大数据、人工智能、云计算等技术的快速发展&#xff0c;全球科技不断突破创新&#xff0c;推动了整个社会的智能化发展&#xff0c;同时&#xff0c;也带动了包含家居业在内的制造行业的技术创新、产品更迭以及更加精细化的经营管理。 数字经济时代&#xff0…

代替塞规的高精度孔径测量方法——泊肃叶压差法

摘要&#xff1a;针对现有压力衰减法孔径测量中存在的基本概念不清和实施方法不明确等问题&#xff0c;本文详细介绍了压力衰减法的孔径测量基本原理&#xff0c;并重点介绍压差法测量中的高精度压力控制方法&#xff0c;为各种微小孔径和等效孔径的准确测量提供切实可行的解决…

EOF的实际含义

在学习C语言的时候&#xff0c;遇到的一个问题就是EOF。 它是end of file的缩写&#xff0c;表示"文字流"&#xff08;stream&#xff09;的结尾。这里的"文字流"&#xff0c;可以是文件&#xff08;file&#xff09;&#xff0c;也可以是标准输入&#x…

Linux tracepoint 简介

文章目录前言一、跟踪点的目的二、跟踪点的使用2.1 简介2.2 DECLARE_TRACE三、TRACE_EVENT参考资料前言 本文提供了如何在内核中插入跟踪点并将 probe functions 连接到它们的示例&#xff0c;并提供了一些 probe functions 的示例。可以在不创建自定义内核模块的情况下使用跟…

高可用 Canal集群( 秒懂 + 史上最全)

文章很长&#xff0c;而且持续更新&#xff0c;建议收藏起来&#xff0c;慢慢读&#xff01;疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 &#xff1a; 免费赠送 :《尼恩Java面试宝典》 持续更新 史上最全 面试必备 2000页 面试必备 大厂必备 涨薪必备 免费赠送 经典…

工控安全-Modbus协议

文章目录一、什么是Modbus协议二、Modbus通信过程三、Modbus存储区四、Modbus协议类型4.1 Modbus RTU协议4.1.1 Modbus报文帧结构4.1.2 主机对从机读数据操作4.1.3 主机对从机写数据操作4.1.4 10功能码数据解析4.1.5 总结4.2 Modbus ACSII协议4.3 Modbus-TCP4.4 Modbus-PLUS一、…

SecXOps 关键技术 模型更新

模型更新 定义内涵 本节的模型更新是指在模型训练完成并正式上线后&#xff0c;由运维人员采集并提供新的数据对 原有模型进行再训练、更新参数的过程。 技术背景 随着时间的推移&#xff0c;由于周期性事件、突变等状况的发生&#xff0c;当下的数据集和之前用于训练 模型…

Anaconda开发环境

Anaconda开发环境 Anacanda是一个基于数据分析和机器学习的集成环境&#xff08;给我们集成好了数据分析和机器学习对应的各种环境和模块&#xff09; jupyter&#xff1a;就是Anaconda这个集成环境提供的一个基于浏览器可视化的编码工具。 注意事项&#xff1a;在环境搭建的…

如何在 iOS、MacOS 上使用 ChatGPT 和适用于 iPhone 的最佳 ChatGPT 应用程序

目录 什么是聊天 GPT&#xff1f;如何在我的 iPhone 上使用 ChatGPT&#xff1f;适用于 iPhone 的最佳 ChatGPT 应用程序 在过去的几周里&#xff0c;出现了许多 ChatGPT 应用程序和网站。如果您想了解什么是 ChatGPT、如何在 iOS 上使用它以及适用于 iOS 的最佳 ChatGPT 应用…

Dockerfile介绍及常用保留指令

从本文开始,咱们将介绍docker的另外一个技术点:dockerfile.我们来看看DockerFile相关的知识点,我们将怎么学习? 1:DockerFile是什么? 2:DockerFile构建过程解析 3:常用的保留字指令 4:案例及小总结。如下图: dockerFile是什么? DockerFile是用来构建Docker镜像…

RV1126笔记五:人脸识别方案<三>

若该文为原创文章,转载请注明原文出处。 一、介绍 通过图片形式,解析图片数据,检测图片上有没有存在人脸,提取人脸特征,把特征数据保存到数据库里。 二、流程图 使用的是Rock-X AI组件库。 三、数据库的使用 在前面,交叉编译了Sqlite3,把编译的库和可执行文件拷贝…

C++:类和对象:多态

1&#xff1a;多态的基本概念 多态就是指多种状态&#xff0c;它是 C面向对象三大特性之一。 多态分为两类 1&#xff1a;静态多态&#xff1a;函数重载和运算符重载。 2&#xff1a;动态多态&#xff1a;派生类和虚函数实现运行时多态。 静态多态和动态多态区别&#xff1a; 1…

set(关联性容器)

众所周知,不会set的人就不会c(你自己编的吧!),到底什么是set呢?我们今天就来了解一下set的奥秘. set是啥 set 作为一个容器也是用来存储同一数据类型的数据类型&#xff0c;并且能从一个数据集合中取出数据&#xff0c;在set 中每个元素的值都唯一&#xff0c;而且系统能根据…

Nacos学习笔记 (5)Nacos整合SpringBoot流程

前提&#xff0c;先下载Nacos并启动 Nacos Server。 1. Nacos 融合 Spring Boot 为注册配置中心 实现&#xff1a; 通过 Nacos Server 和 nacos-config-spring-boot-starter 实现配置的动态变更&#xff1b;通过 Nacos Server 和 nacos-discovery-spring-boot-starter 实现服…

16、Mysql高级之锁问题

16、Mysql高级之锁问题 文章目录16、Mysql高级之锁问题1、锁概述2、锁分类3、Mysql 锁4、MyISAM 表锁4.1 如何加表锁5.2.2 读锁案例4.3、写锁案例4.4、结论4.5、查看锁的争用情况5、InnoDB 行锁5.1、行锁介绍5.2、背景知识5.3、InnoDB 的行锁模式5.4、案例准备工作5.5、行锁基本…