InnoDB详解2

news/2024/5/2 17:09:05/文章来源:https://blog.csdn.net/weixin_45914119/article/details/128418086

文章目录

  • 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.luyixian.cn/news_show_239413.aspx

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

相关文章

解决资源消耗,top的运用记录

第一条命令uptime load average 后面的三个数字,分别代表1分钟、5分钟和15分钟内机器的平均负载 使用top命令解决负载问题 Cpu(s)这一行提供了CPU运行情况信息 这些缩写分别代表了不同含义 (1)us:用户CPU时间 运行非优雅的用户进程所占CPU时间的百…

Python学习笔记(十九)——Matplotlib入门上

目录 Matplotlib简介 导入matplotlib模块 图的参数说明 matplotlib图像组成部分介绍 matplotlib绘图步骤分析 matplotlib实现简单图像 matplotlib画布 画布-plt.figure() 实例 同一画布制作多张图像 创建多个子图 实例 plt.subplots 相关参数 调整subplot周围的间距…

简单记录一下怎么看package.json文件

首先每个vue工程文件从仓库克隆代码下来的时候,一般都会包含这个文件,这个文件非常重要,package.json包含了关于项目重要信息,如下图所示 其中包含了name、version、description、author、scripts、dependencies、devDependencies…

小结 | 决策树

一.基本原理 决策树是一种树状结构模型,每一个根节点都是一个特征判断,它的叶子节点就是它的特征分类结果 决策树是一种分类和回归的基本模型,是一棵树的形式,其实就是将平时所说的 if-else 语句构建成了树的形式。决策树主要包…

短视频引流+私域流量沉淀,一个全新的短视频和链动模式结合方案

在微盟企微助手微盟智慧零售团队的协助下,今年7月底么么茶正式开始运营企微私域,截至当前,在短短3个月时间已成功沉淀7万私域客户,线上商城GMV超145万。 么么茶旅拍的核心流量来源自公域短视频平台,品牌基于服务覆盖下…

deck.gl 调研

0 结论 deck gl 是基于 WebGL 的数据可视化框架,可以集成在主流的地图框架(arcgis,google maps,mapbox )中使用, 也可以单独使用。 deck gl 通过layer进行数据可视化,支持多种展示效果&#xf…

ASP.NET开源版MES加工装配模拟系统源码/WinForm工厂加工装配系统源码/流程工序管理

一、源码描述 本系统用户大学机械科上位机加工装配模拟实验,目前正常用于实验当中。环境:VS2010(C# .NET4.0,多层结构)、sqlserver2008 r2 ;Winform;使用到RFID读写器(设备是可以变更的,修改RFID.Library项目的…

数字三角形问题

数字三角形问题一、题目描述二、题目分析1、问题分析2、思路分析(1)状态转移方程状态表示状态转移(2)循环的设计三、代码实现一、题目描述 二、题目分析 1、问题分析 这道题给我们的第一眼感觉就是情况太多了,太复杂…

【TypeScript】常用类型声明详情概述

目录 TypeScript常用类型 类型注解 TS类型概述 原始类型 数组类型 对象类型 函数类型 类型别名 接口 元组 字面量类型 枚举 any类型 typeof操作符 类型推论 类型断言 TypeScript常用类型 TypeScript是JS的超集,TS提供了JS的所有功能,并额…

PyInstaller的常用打包命令

学习了pyqt后,设计了界面,并且需要打包为exe程序。 每次打包时,都要查好久资料,故此记录一下常用的命令。 PyInstaller 是一个 Python 应用程序打包工具,它可以将 Python 程序打包为单个独立可执行文件。 要使用 P…

11Python面相对象基础语法

面相对象基础语法 01. dir 内置函数 在 Python 中 对象几乎是无所不在的,我们之前学习的 变量、数据、函数 都是对象 在 Python 中可以使用以下两个方法验证: 使用内置函数 dir 传入 标识符 / 数据,可以查看对象内的 所有属性及方法 提示…

虚拟机docker网络问题处理

问题 我们有2台设备,ip 为 172.20.30.1 172.20.30.2 ,虚拟机上的服务需要连接这2台设备,网络已经做通了,可以正常连接虚拟机异常关闭,重新开启后。发现服务有些问题,就打算将docker服务重新部署&#xff0…

面渣逆袭:Java并发六十问,快来看看你会多少道

这篇文章有点长,四万字,图文详解六十道Java并发面试题。人已经肝麻了,大家可以点赞、收藏慢慢看!扶我起来,我还能肝! 基础 1.并行跟并发有什么区别? 从操作系统的角度来看,线程是…

善康医药冲刺科创板上市:计划募资13亿元,上半年亏损5000万元

近日,深圳善康医药科技股份有限公司(下称“善康医药”)在上海证券交易所递交招股书,准备在科创板上市。本次冲刺上市,善康医药计划募资13.27亿元,将用于新药研发项目、创新药高端制剂生产基地建设项目、营销…

Influxdb双写服务influxdb-relay部署配置【离线】

Background Influxdb社区版未提供集群方案,官方提供的集群模式为闭源收费版本,具体收费明细不太清楚哈,有知道的请留言告知哈。官方开源的influxdb-relay仅仅支持双写功能,并未支持负载均衡能力,仅仅解决了数据备份的问…

Simulink代码生成: Switch模块及其代码

本文描述Switch模块的建模并研究生成的代码。 文章目录1 Simulink中的Switch模块2 Switch模块建模及代码生成3 Switch模块其他用法3.1 多重Switch3.2 通过标定量Switch4 总结1 Simulink中的Switch模块 在Simulink中Switch模块时非常常见的,通常用于根据一定地条件选…

【代码随想录】二刷-贪心算法

贪心算法 《代码随想录》 什么是贪心? 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 贪心没有规定的套路。 刷题或面试的时候,手动模拟一下感觉可以局部最优退出整体最优,而且想不到反例,那么就试一试贪心。…

Java开发如何通过IoT边缘ModuleSDK进行进程应用的开发?

摘要:为解决用户自定义处理设备数据以及自定义协议设备快速接入IOT平台的诉求,华为IoT边缘提供ModuleSDK,用户可通过集成SDK让设备以及设备数据快速上云。本文分享自华为云社区《【华为云IoTEdge开发实战】Java开发如何通过IoT边缘ModuleSDK进…

软件测试:sql注入·依赖基本sql语句

查询语句 目的:回顾数据库查询条件语句(手工sql注入操作基础知识) 语句: 1. 查询所有字段:select * from users; 2. 查询指定字段: select user,password from users; 3. 条件查询:…

当红齐天再捧“绽放杯”金奖:全流程算力网络夯实元宇宙“底座”

近日,由工信部主办的第五届“绽放杯”5G应用征集大赛在深圳落幕。本届大赛以“5G赋能数字化,扬帆助力新征程 ”为主题,超7000家单位的2.8万个项目参赛,共享5G赋能实体经济的新技术、新成果。英特尔联合行业合作伙伴再获佳绩。 其…