【MySQL】表中的一条数据在磁盘上是如何存放的?

文章目录

    • 1 InnoDB行格式
    • 2 COMPACT行格式
      • 2.1 记录的额外信息
      • 2.2 记录的真实数据
    • 3 Dynamic & Compressed
    • 4 VarChar(n)中n的最大取值?

1 InnoDB行格式

不同的存储引擎一般是为实现不同的特性来开发的,真实数据在不同存储引擎中的存放格式一般是不同的,甚至有的存储引擎(比如 MEMORY)都不用磁盘来存储数据,也就是对于使用 MEMORY 存储引擎的表来说,关闭服务器后表中的数据就消失了。 lnnoDB是MySQL 默认的存储引擎,也是我们最常用到的存储引擎。

当我们想从表中获取某些记录时, lnnoDB 存储引擎需要一条一条地把记录从磁盘上读出来么?不,这样重复访问磁盘会非常非常非常慢😶,lnnoDB 采取的方式是,将数据划分为若干个页 ,以页作为磁盘和内存之间交互的基本单位。lnnoDB 页的大小一般为16KB = 16384B 。也就是在一般情况下,一次最少从磁盘中读取 16KB 的内容到内存中,一次最少把内存中的 16KB 内容刷新到磁盘中。

Tips:系统变量innodb_page _size只能在第一次初始化MySQL数据目录时指定,运行过程中不可更改页面大小。

我们平时都是以记录为单位向表中插入数据的,这些记录在磁盘上的存放形式也被称为行格式或者记录格式,可以在创建或修改表的语句中指定记录所使用的行格式。目前有4种行格式:

  • COMPACT:占用空间较小,适合具有大量重复数据的表。
  • REDUNDANT:不再被推荐使用,用于兼容旧版本。
  • DYNAMIC:支持更多的数据类型和功能,适用于各种情况。
  • COMPRESSED:将数据进行压缩,可以显著减小存储空间,但可能会增加CPU负担。

2 COMPACT行格式

2.1 记录的额外信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-opno3O4M-1691565461901)(【MySQL】表中的一条数据在磁盘上是如何存放的?/image-20230809141938930.png)]

1、变长字段长度列表(如果无变长字段,没有该部分)

变长字段列表仅存储非NULL列。

VARCHAR(M)、 BINARY(M)、各种 TEXT 类型、各种 BLOB 类型等变长字段占用的存储空间分为两部分:真正的数据内容 + 该数据占用的字节数。COMPACT 行格式中,所有变长字段的真实数据占用字节数都存放在记录的开头位置,各变长字段的真实数据占用的字节数按照列顺序逆序存放

1个字节能表示的最大值为0xFF = 255,2个字节能表示的最大值为0xFFFF = 65535。给定以下符号表示。

  • W W W:某个字符集中最多需要W字节来表示一个字符,比如utf8mb4字符集中的W就是4

  • M M M:对于变长类型 VARCHAR(M),能存储最多M个字符

  • L L L:该变长字段实际存储的字符串占用的字节数是 L

如果该变长字段允许存储的最大字节数 M × W M\times W M×W 超过 255 字节,并且真实数据占用的字节数 L L L超过 127 字节,则使用2字节来表示真实数据占用的字节数,否则使用1字节。

如果某个字段占用的字节数特别多, InnoDB 有可能把该字段的值的一部分数据存放到所谓的溢出页中。

对于 CHAR(M)类型的列来说,当列采用的是定长编码的字符集时,该列占的字节数不会被加到变长字段长度列表:而如果采用变长编码的字符集时 该列占用的字节数就会被加到变长字段长度列表。

2、NULL值列表(如果无NULL值,没有该部分)

COMPACT 行格式把一条记录中值为 NULL 的列统一管理起来 ,存储到 NULL 值列表。对表中未限制Not Null的列,按列顺序逆序存储二进制位,1代表NULL,0代表不为NULL。MYSQL规定NULL值列表必须为整数字节,若不足,在高位补0。

3、记录头信息(固定5字节)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LYOKCh2Q-1691565461902)(【MySQL】表中的一条数据在磁盘上是如何存放的?/image-20230809140739253.png)]

2.2 记录的真实数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ndXUAMVp-1691565461903)(【MySQL】表中的一条数据在磁盘上是如何存放的?/image-20230809142325572.png)]

3 Dynamic & Compressed

如果某个字段占用的字节数特别多, InnoDB 有可能把该字段的值的一部分数据存放到所谓的溢出页中,在记录的真实数据处只会存储该列的部分数据,而把剩余的数据分散存储在几个其他的页中 然后在记录的真实数据处用 20 字节存储指向这些页的地址。

img

Compressed 和 Dynamic 这两个行格式和 Compact 非常类似,主要的区别在于处理行溢出数据时有些区别。

这两种格式采用完全的行溢出方式,记录的真实数据处不会存储该列的一部分数据,只存储 20 个字节的指针来指向溢出页。而实际的数据都存储在溢出页中。

img

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3h6qYjgz-1691565461903)(【MySQL】表中的一条数据在磁盘上是如何存放的?/image-20230809144148449.png)]

4 VarChar(n)中n的最大取值?

MySQL规定:一行记录除了 TEXT、BLOBs 类型的列(不包括隐藏列和记录头信息),限制最大为 65535 字节。

SO:要保证所有字段的长度 + 变长字段字节数列表所占用的字节数 + NULL值列表所占用的字节数 <= 65535

在这里插入图片描述

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

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

相关文章

机器学习基础

什么是机器学习&#xff1f;----本质就是寻找一个函数。 可以训练什么样的函数呢&#xff1f; 可以训练一个回归的函数&#xff0c;也可以训练一个分类的函数。 这个例子的需要分类的类别是19*19的选项。 在机器学习领域里面不止回归和分类。 举例&#xff1a;预测函数 利用已…

Nginx(3)

目录 1.Nginx虚拟主机1.1基于IP虚拟主机1.2基于端口虚拟主机1.3基于域名实现的虚拟主机 2.日志详解 1.Nginx虚拟主机 虚拟主机&#xff0c;Nginx配置中的多个server{}区域对应不同的业务(站点) 虚拟主机方式基于域名的虚拟主机不同的域名访问不同的站点基于IP的虚拟主机不同的…

第一百二十五天学习记录:C++提高:STL-deque容器(下)(黑马教学视频)

deque插入和删除 功能描述&#xff1a; 向deque容器中插入和删除数据 函数原型&#xff1a; 两端插入操作&#xff1a; push_back(elem); //在容器尾部添加一个数据 push_front(elem); //在容器头部插入一个数据 pop_back(); //删除容器最后一个数据 pop_front(); //删除容器…

低成本NFC端口静电保护方案图及ESD二极管选型指南

Near Field Communication&#xff0c;简称&#xff1a;NFC&#xff0c;中文名称&#xff1a;近场通信&#xff0c;是一种短距离高频的无线电技术&#xff0c;能够实现近距离无线通讯和数据交换&#xff0c;是由非接触式射频识别&#xff08;RFID&#xff09;及互连互通技术整合…

微服务学习笔记-基本概念

微服务是一种经过良好架构设计的分布式架构方案。根据业务功能对系统做拆分&#xff0c;每个业务功能模块作为独立项目开发&#xff0c;称为一个服务。 微服务的架构特征&#xff1a; 单一职责&#xff1a;微服务拆分粒度更小&#xff0c;每一个服务都对应唯一的业务能力&…

数据标注对新零售的意义及人工智能在新零售领域的应用?

数据标签对于新零售至关重要&#xff0c;因为它构成了训练和部署人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;模型的基础。在新零售的背景下&#xff0c;数据标签涉及对数据进行分类、标记或注释以使其能够被机器理解的过程。然后&#xff0c;这些…

Qt应用开发(基础篇)——框架类 QFrame

一、前言 QFrame继承于QWidget&#xff0c;被QLCDNumber、QToolBox、QLabel、QListView等部件继承&#xff0c;是一个拥有矩形框架的基类。 QFrame可以直接创建成一个没有内容的的矩形框架&#xff0c;框架的样式由边框厚度(lineWidth)、框架形状(QFrame::Shape)和阴影样式(QFr…

浏览器多管闲事之跨域

年少时的梦想就是买一台小霸王游戏机 当时的宣传语就是小霸王其乐无穷~。 大些了&#xff0c;攒够了零花钱&#xff0c;在家长的带领下终于买到了 那一刻我感觉就是最幸福的人 风都是甜的&#xff01; 哪成想... 刚到家就被家长扣下了 “”禁止未成年人玩游戏机 (问过卖家了&a…

Transformer理论学习

Transformer出自于论文《attention is all you need》。 一些主流的序列模型主要依赖于复杂的循环结构或者CNN&#xff0c;这里面包含了编解码器等。而Transformer主要的结构是基于注意力机制&#xff0c;而且是用多头注意力机制去替换网络中的循环或者CNN(换言之就是transfor…

CD4029计数器实测仿真及BCD转七段码

前面的博文中&#xff0c;我们介绍过CD40110(这是一个常见的直接接7段数码管的计数器&#xff0c;我们这里介绍一款新的计数器CD4029&#xff0c;这也是很常见的计数器&#xff0c;不同的是后者可以输出BCD编码。 文章目录 一、总体效果二、CD4029的管脚和功能介绍1、芯片功能简…

使用 PowerShell 将 Excel 中的每个工作表单独另存为独立的文件

导语&#xff1a;在日常工作中&#xff0c;我们经常需要处理 Excel 文件。本文介绍了如何使用 PowerShell 脚本将一个 Excel 文件中的每个工作表单独另存为独立的 Excel 文件&#xff0c;以提高工作效率。 1. 准备工作 在开始之前&#xff0c;请确保已经安装了 Microsoft Exc…

【毕业项目】自主设计HTTP

博客介绍&#xff1a;运用之前学过的各种知识 自己独立做出一个HTTP服务器 自主设计WEB服务器 背景目标描述技术特点项目定位开发环境WWW介绍 网络协议栈介绍网络协议栈整体网络协议栈细节与http相关的重要协议 HTTP背景知识补充特点uri & url & urn网址url HTTP请求和…

Pr2022安装插件beat edit安装之后无法加载音乐怎么办?

你运行设置不对&#xff0c;安装好后试试管理员权限运行。 安装好插件后点击上方的窗口&#xff0c;然后再在里面找到扩展&#xff0c;继续点开里面有个BeatEdit&#xff0c;就是插件本身&#xff0c;点开。先选择一个加载音乐的选项&#xff0c;载入音乐先。这个时候可以按下…

CSS 滚动条

一、滚动条样式属性 ::-webkit-scrollbar {width: 6px; /* 竖向滚动条宽度 */height: 6px; /* 横向滚动条高度 */ }::-webkit-scrollbar-thumb {border-radius: 10px; /* 滚动条样式 */-webkit-box-shadow: inset 0 0 3px red; /* 内阴影 */background-color: blue; /* 滚动条…

Redhat Linux 安装MySQL安装手册

Redhat安装MySQL安装手册 1 下载2 上传服务器、解压并安装3 安装安装过程1&#xff1a;MySQL-shared-5.6.51-1.el7.x86_64.rpm安装过程2&#xff1a;MySQL-shared-compat-5.6.51-1.el7.x86_64.rpm安装过程3&#xff1a;MySQL-server-5.6.51-1.el7.x86_64.rpm安装过程4&#xff…

Flutter运行app时向logcat输出当前打开的界面路径且点击可跳转

当一个项目大了目录文件多了&#xff0c;我们往往会为了找到一个文件花费大量的时间和精力&#xff0c;为了快捷方便的调试我们的项目&#xff0c;我们往往需要在打开app运行的时候需要知道当前打开的界面的文件在哪儿&#xff0c;我们这个代码就能快捷的知道我们app正在打开的…

spring-cache框架使用笔记

spring-cache框架使用笔记 什么是spring-cache框架 spring-cache是spring框架中的一个缓存抽象层&#xff0c; 它提供了一种简便的方式来集成不同的底层缓存实现&#xff0c; 如内存缓存(concurrentMap/ehcache/caffeine)/分布式缓存(redis/couchbase)等 它简化了在app中使用…

现代C++中的从头开始深度学习【1/8】:基础知识

一、说明 提及机器学习框架与研究和工业的相关性。现在很少有项目不使用Google TensorFlow或Meta PyTorch&#xff0c;在于它们的可扩展性和灵活性。也就是说&#xff0c;花时间从头开始编码机器学习算法似乎违反直觉&#xff0c;即没有任何基本框架。然而&#xff0c;事实并非…

Unity制作护盾——2、力场冲击波护盾

Unity制作力场护盾 大家好&#xff0c;我是阿赵。   继续做护盾&#xff0c;这一期做一个力场冲击波护盾。 一、效果展示 主要的效果并不是这个球&#xff0c;而是护盾在被攻击的时候&#xff0c;会出现一个扩散的冲击波。比如上图在右边出现了冲击波 如果在左边被攻击&am…

C/C++面试总结

一、关键字static、const、extern、volatile作用 1、const 1.修饰常量 用const修饰的变量是不可变的&#xff0c;修饰后的变量只能使用&#xff0c;不能修改。 2.修饰指针 如果const位于*的左侧&#xff0c;eg&#xff1a;const int* a&#xff0c;则const就是用来修饰指针…