【MySQL - InnoDB 存储结构】行格式详解

news2024/9/29 18:07:23

我们平时对 MySQL 的了解都只是限制在使用层面上,但是难道你就没有一个时刻好奇 MySQL 的内部结构嘛,我们通过 SQL 语句插入的一条条记录在 MySQL 底层到底是以什么格式存储的呢 ? 本文就将以 InnoDB 存储引擎为例子,介绍 MySQL 存储引擎的数据存储结构

背景知识

InnoDB 存储引擎将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16 KB 。 ( 不然一条条从磁盘中读数据很慢 )

一、什么是行格式

我们插入的一条记录在磁盘中的存放方式称为行格式(也叫记录格式),InnoDB 共具有 4 种不同类似的行格式 。

指定某个表的行格式方法

CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称
ALTER TABLE 表名 ROW_FORMAT=行格式名称

在这里插入图片描述

二、Compact 行格式

在这里插入图片描述

1. 记录的额外信息

—— 为了描述该条记录不得不添加的信息

1.1 变长字段长度列表

变长字段包括: VARCHAR(MAX) 、 VARBINARY(MAX) 、各种 TEXT 类型,各种 BLOB 类型 等, 其占用的存储空间分为 真正的数据内容占用的字节数 两部分。因为变长字段中存储多少字节的数据是不固定的 , 所以我们需要存储变长字段长度,从而提示 MySQL 服务器。

背景设定:
字符 —— 相对于字符集提出 (ASSCI, UTF8 等)。
M —— 该类型最多存放 M 个字符 , 例如 varchar(M)。
W —— 一个字符最多需要的字节数,如 ASSIC 字符集1个字符最多需要1个字节。
L —— 当前存放的值实际占用的字节数

  • W * M <= 255 ,用 1 个字节来表示真正字符串占用的字节数 ( 一个字节 8 位 , 表示的最大整数是 255)
  • M×W > 255
    (1)L <= 127 ,则用1个字节来表示真正字符串占用的字节数
    (2)L > 127 ,则用2个字节来表示真正字符串占用的字节数
    为什么是 127 ? 节约空间,减少空间的浪费

总结:如果该可变字段允许存储的最大字节数超过255字节并且真实存储的字节数超过127字节,则使用2个字节,否则使用1个字节

注意: 1. 存储的长度值按照列逆序排放 2. 不存储 null 值的长度

1.2 NULL 值列表

NULL 值都记录到真实数据中很占空间,所以统一使用空值列表管理空值

处理过程:

  1. 统计出允许存储空值的列 (没有允许存储 NULL 的列,NULL值列表不存在)
  2. 允许存储空值的列对应一个二进制位,二进制位为 1 , 表示该列为 NULL
  3. 空值列表必须用整数个字节表示,不是整数个字节的话,则在最高位补 0

1.3 记录头信息

记录头信息由固定的 5 个字节组成:

在这里插入图片描述

各个区域表示的含义如下 :

在这里插入图片描述

2. 记录的真实数据

3 个隐藏列 (行ID + 事务 id + 回滚指针) + 我们自己定义的列

其中 行ID 是可选的,这是由主键生成策略决定的 。

主键生成策略:

  1. 优先使用用户自定义主键作为主键
  2. 如果用户没有定义主键,则选取一个 Unique 键作为主键
  3. Unique 键没有定义,默认添加一个名为 row_id 的隐藏列作为主键。

3. 有关 CHAR(M) 的特殊性

  • 定长字符集(ASSIC、UTF8等) : 该列占用的字节数不会被加到变长字段长度列表
  • 变长字符集(如 gck)时:该列占用的字节数会被加到变长字段长度列表。

变长字符集下的 CHAR(M) 类型的列要求至少占用 M 个字节,即使向该列中存储一个空字符串也会占用 M 个字节。

目的: 更新数据时,不长于 M 字节的数据可以在该记录处直接更新,而不是在存储空间中重新分配一个新的记录空间,导致原有的记录空间成为碎片。

三、 Redundant 行格式 (过时)/rɪˈdʌn.dənt/

其结构如下 ——

在这里插入图片描述

1. 字段长度偏移列表

实质上是存储每个列中的值占用的空间在 记录的真实数据 处结束的位置,其是一堆差值的组合。

2. 有关行溢出

2.1 VARCHAR(M) 类型的列 —— 有关 M 的行溢出

65535 —— 一列的最多字节数 (2 的 16 次方 - 1)

  • ASSIC 类型 —— 即一个字符占用一个字节
  • NULL - 存储 65532 个字节的数据,包含1个字节长度的空表和2个字节的长度表
  • NOT NULL - 存储 65533 个字节的数据,因为其不含空表

如果使用的不是 ascii 字符集,那 M 的最大取值取决于该字符集表示一个字符最多需要的字节数。
在列的值允许为 NULL 的情况下:

  • gbk - M 的最大取值就是 32766 (65532/2),即最多能存储 32766 个字符;
  • utf8 - M 的最大取值就是 21844 (65532/3)个字符

2.2 因为数据太长导致的溢出 —— 源于一个页放不了一条记录的情况

当一个行中存储了很大的数据时,可能发生 行溢出 的现象

Compact 和 Reduntant 行格式中,对于占用存储空间非常大的列,在 记录的真实数据 处只会存储该列的一部分数据,把剩余的数据分散存储在溢出页中,记录的真实数据处用20个字节存储指向这些页的地址,从而可以找到剩余数据所在的页

在这里插入图片描述

2.3 行溢出临界值

MySQL 中规定一个页中至少存放两行记录 , 页中存放的乱七八糟的数据也需要 136 个字节 。 每个记录需要 27 个字节的额外数据。

在这里插入图片描述

136 + 2 × (27 + n) > 1024 * 1616 KB

计算得: 在只有一个列的情况下,如果一个列中存储的数据不大于 8098 个字节,那就不会发生行溢出 ,否则就会发生行溢出 。

四、Dynamic 行格式(5.7 默认的)& Compressed 行格式

存储结构类似 Compact 行格式,只在处理 行溢出 时不同,其不记录真实数据的前 768 个字节,而是所有字节都存储到溢出页面中,只记录真实数据所在的地址。

在这里插入图片描述

Compressed vs Dynamic —— Compressed 行格式会采用压缩算法对页面进行压缩,以节省空间。

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

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

相关文章

专科top4|临床医生CSC公派博士后美国凯斯西储大学医院赴职

Q医生符合CSC公派博士后申报条件&#xff0c;我们先为其取得Hopkins的邀请函并获CSC批准&#xff0c;后因导师失联&#xff0c;为保险起见&#xff0c;我们又继续申请并获得凯斯西储大学医学院彩虹宝宝和儿童医院的邀请函&#xff0c;该院连续20年被评为全美最好儿童医院&#…

【vulhub漏洞复现】CVE-2015-5254 ActiveMQ反序列化漏洞

一、漏洞详情Apache ActiveMQ是美国阿帕奇&#xff08;Apache&#xff09;软件基金会所研发的一套开源的消息中间件&#xff0c;它支持Java消息服务&#xff0c;集群&#xff0c;Spring Framework等。配置Apache ActiveMQ需要提前有jdk的环境。基于MQTT&#xff0c;消息订阅和分…

Javascript的API基本内容(三)

一、事件流 假设页面里有个div&#xff0c;当触发事件时&#xff0c;会经历两个阶段&#xff0c;分别是捕获阶段、冒泡阶段简单来说&#xff1a;捕获阶段是 从父到子 冒泡阶段是从子到父实际工作都是使用事件冒泡为主 二、页面加载事件 加载外部资源&#xff08;如图片、外联CS…

Portraiture4免费磨皮插件支持PS/LR

Portraiture 4免去了繁琐的手工劳动&#xff0c;选择性的屏蔽和由像素的平滑&#xff0c;以帮助您实现卓越的肖像润色。智能平滑&#xff0c;并删除不完善之处&#xff0c;同时保持皮肤的纹理和其他重要肖像的细节&#xff0c;如头发&#xff0c;眉毛&#xff0c;睫毛等。 一键…

Python Flask + Echarts 轻松制作动态酷炫大屏( 附代码)

目录一、确定需求方案二、整体架构设计三、编码实现 &#xff08;关键代码&#xff09;四、完整代码五、运行效果1.动态实时更新数据效果图 说明: 其中 今日抓拍&#xff0c;抓拍总数&#xff0c;预警信息统计&#xff0c;监控点位统计图表 做了动态实时更新处理。 ​ 2.静态…

Java岗面试题--Java并发(volatile 专题)

目录1. 面试题一&#xff1a;谈谈 volatile 的使用及其原理补充&#xff1a;内存屏障volatile 的原理2. 面试题二&#xff1a;volatile 为什么不能保证原子性3. 面试题三&#xff1a;volatile 的内存语义4. 面试题四&#xff1a;volatile 的实现机制5. 面试题五&#xff1a;vol…

用c语言模拟实现常用字符串函数

目录 一.常用字符串函数介绍 1.strlen 2. strcpy 3.strcmp 4.strcat 5.strstr 二.模拟实现常用字符串函数 1.strlen 2.strcpy 3.strcmp 4.strcat 5.strstr 一.常用字符串函数介绍 1.strlen 字符串strlen是用来求字符串长度的&#xff0c;我们可以打开cpp网站查看有关…

浅谈模型评估选择及重要性

作者&#xff1a;王同学 来源&#xff1a;投稿 编辑&#xff1a;学姐 模型评估作为机器学习领域一项不可分割的部分&#xff0c;却常常被大家忽略&#xff0c;其实在机器学习领域中重要的不仅仅是模型结构和参数量&#xff0c;对模型的评估也是至关重要的&#xff0c;只有选择那…

vector迭代器失效与深浅拷贝问题

目录 1、vector迭代器失效问题 1.1、insert迭代器失效 扩容导致野指针 意义变了 官方库windows下VS和linux下对insert迭代器失效的处理 1.2、erase迭代器失效 官方库windows下VS和linux下对erase迭代器失效的处理 1.3、迭代器失效总结 2、深浅拷贝问题 1、vector迭…

GeoServer发布数据进阶

GeoServer发布数据进阶 GeoServer介绍 GeoServer是用于共享地理空间数据的开源服务器。 它专为交互操作性而设计&#xff0c;使用开放标准发布来自任何主要空间数据源的数据。 GeoServer实现了行业标准的 OGC 协议&#xff0c;例如网络要素服务 &#xff08;WFS&#xff09;…

Java【优先级队列】模拟实现 + 【PriorityQueue】介绍

文章目录一、什么是优先级队列二、模拟实现1, 实现堆的基本操作1.1, 创建堆1.2.1, 向下调整1.2, 堆的插入1.2.1, 向上调整1.2, 堆的删除2, 实现优先级队列2.1, offer -- 插入数据2.1, poll -- 删除数据三、Java提供的PriorityQueue1, PriorityQueue说明2, 使用PriorityQueue2.1…

【Linux】安装Tomcat教程

目录 1.上传安装包 2.解压安装包 3.启动Tomcat 4.查看启动日志 5.查看进程 6.开放端口 7.停止Tomcat 1.上传安装包 使用FinalShell自带的上传工具将Tomcat的二进制发布包上传到Linux(与前面上传JDK安装包步骤 一致)。 2.解压安装包 将上传上来的安装包解压到指定目录…

2023年想跳槽,什么类型的人才需求最多?

某招聘网站资深HR对此表示&#xff1a;纵观当前招聘市场&#xff0c;无论是比较火爆的互联网行业还是传统行业&#xff0c;技能型人才都是最受欢迎的人才之一&#xff1b;那些拥有职场一技之能的跳槽者往往跳的结果更好&#xff0c;包括薪酬水平和发展空间、重视程度等。 那选择…

一个更适合Java初学者的轻量级开发工具:BlueJ

Java是世界上最流行的编程语言之一&#xff0c;它被广泛用于从Web开发到移动应用的各种应用程序。大部分Java工程师主要是用IDEA、Eclipse为主&#xff0c;这两个开发工具由于有强大的能力&#xff0c;所以复杂度上就更高一些。如果您刚刚开始使用Java&#xff0c;或者您更适合…

如何简化跨网络安全域的文件发送流程,大幅降低IT人员工作量?

为什么要做安全域的隔离&#xff1f; 随着企业数字化转型的逐步深入&#xff0c;企业投入了大量资源进行信息系统建设&#xff0c;信息化程度日益提升。在这一过程中&#xff0c;企业也越来越重视核心数据资产的保护&#xff0c;数据资产的安全防护成为企业面临的重大挑战。 …

自动化测试学习步骤及路线(超详细)

随着测试行业的不断发展&#xff0c;目前企业对测试人员要求越来越高&#xff0c;仅仅响应需求的功能测试人员基本饱和或是留给了校招生。而对于社招渠道的应聘者&#xff0c;企业越来越多地要求有一定的自动化或是代码经验&#xff0c;能解决工作过程中遇到的问题&#xff0c;…

ledcode【用队列实现栈】

目录 题目描述&#xff1a; 解析题目 代码解析 1.封装一个队列 1.2封装带两个队列的结构体 1.3封装指向队列的结构体 1.4入栈函数实现 1.5出栈函数实现 1.6取栈顶数据 1.7判空函数实现 题目描述&#xff1a; 解析题目 这个题我是用c语言写的&#xff0c;所以队列的pu…

魔兽世界WoW注册网站搭建——-Liunx

问题背景哎 搭建了一个魔兽3.35&#xff08;纯洁版&#xff09;每当同学朋友要玩的时候我都直接worldserver上面打一个命令随之出现朋友的朋友也要玩想了想还是要有一个网站原本以为吧单机版里面网页的IP数据库改下可以了结果PHP报错了Unknown column sha_pass_hash in field l…

学校AI视频行为分析监测系统 opencv

学校AI视频行为分析监测系统通过pythonopencv网络模型AI视频分析技术&#xff0c;学校AI视频行为分析监测算法对学校区域人员打架行为识别、跌倒行为识别、翻墙识别、人员聚众识别、攀高识别、抽烟行为等进行智能识别预警。OpenCV的全称是Open Source Computer Vision Library&…

C#专栏目录(长期更新)

文章目录C# 基础C#进阶C#应用WPF基础WPF 3D小游戏C# 基础 1996年&#xff0c;微软用年薪三百万美刀的价格从Borland挖来了大神海尔斯伯格&#xff0c;开始了J开发&#xff0c;用以对抗Java。但SUN公司认为此举违反了Java开发平台的中立性&#xff0c;对微软提出诉讼。C#正是在…