MySQL的页与行格式

什么是MySQL的页?

页是指存储引擎使用的最小的数据存储单位。
当 MySQL 执行读取或写入操作时,是以页为基本单位来进行操作的。即使读写一条数据,MySQL 也会按页操作。
MySQL 的存储引擎会将数据分成多个页,并根据需要将这些页加载到内存中进行处理。
通过使用页来组织数据,MySQL 能够更高效地管理存储空间,减少读取数据时的硬盘 I/O 次数,从而提高数据库的性能。

MySQL 页的组成?

  • 页头:页头包含了关于该页的一些元数据信息,例如页类型、页号、页大小等。页头还可能包含用于管理该页的一些控制信息。
  • 记录:记录是页中存储的实际数据内容,记录可以包含行数据、索引信息等。记录的组织方式和格式会根据具体的数据表结构和存储引擎的实现而有所不同。
  • 空闲空间:空闲空间是指页面中尚未被使用的空间,用于存放新的行数据或者在更新操作中的数据版本管理。数据库系统会动态地管理和维护空闲空间,以便高效地利用页面的存储空间。
  • 页校验和:有些数据库系统会在页中存储校验和信息,用于检测页的完整性和数据一致性。校验和可以帮助系统检测存储介质上的数据损坏或者传输过程中的错误。
  • 其他元数据:除了以上列出的内容之外,页还可能包含其他元数据信息,例如版本号、事务相关信息、锁信息等,这些信息有助于数据库系统实现事务管理、并发控制等功能。

MySQL数据为什么要存储在页上?

方便管理,提高数据的访问效率。
方便管理:通俗的理解,MySQL的页就好比一个个抽屉,数据就是放抽屉里的中药,方便对每一小块的资源进行处理。
提高数据的访问效率:MySQL可以存储大量数据,如果不存储在页上进行拆分,一次性存储在磁盘上,一次性加载几个G到内存,不是一个好的情况。

并为索引做准备,如果用B+tree作索引,想把大量的数据放入1-3层非线性的b+tree树中,若没有页来压缩归类,很难放得下。

MySQL的数据在磁盘上是紧凑的连续存储的吗?

不是。
紧凑的连续存储,舒服了强迫症工程师,但不适应磁盘。
如果是紧凑的连续存储,对表数据的头部或中间进行数据的插入、删除操作,那么后面的数据就需要移动来保证数据存储的连续性,这个过程消耗资源且无意义。
所以只需要保证逻辑上的关联就行,加个链表就能解决数据之间的关联问题。

页和索引有什么关系?

没有因果关系,但有合作关系。
没有因果体现在:页是用来存储数据,索引是用来提高查询速度的。
合作关系,体现在:MySQL加载数据是按页加载的,不是按照id一条一条加载。索引的创建,b+tree的各种节点,也是按照页来的。

默认页大小?

16KB。

MySQL 行、页、区、段、表空间什么联系?

  • 行就是一条一条的数据,并按照行格式,包含一些字段记录头的信息。
  • 多个行组合成一个页,页是指存储引擎使用的最小的数据存储单位。
  • 64个连续页组成一个区,默认一个区16KB大小,64个区刚好1MB。
  • 多个区组成一个段,段是数据库的分配单位。
  • 多个段组成一个表空间,表空间是逻辑上的存在,表空间又分为系统表空间,用户表空间,撤销表空间和临时表空间。

MySQL 行、页、区、段、表空间存在的意义是什么,解决了什么问题?

  • 行:就是一条条的数据,专门把数据放表服务于业务,没什么好说的。
  • 页:是指存储引擎使用的最小的数据存储单位,当 MySQL 执行读取或写入操作时,是以页为基本单位来进行操作的,若引擎对数据读写逐行处理,太细的粒度的读写会增加硬盘 I/O 次数,降低性能。
  • 区:区的引入有助于提高数据的连续性和存取效率。
  • 段:帮助数据库系统更好地优化存储空间的使用和数据访问的效率。
  • 表空间:通过表空间的划分和管理,可以实现对数据存储结构的灵活控制和优化。

MySQL 页的分类?

  • 数据页(Data Pages):用于存储表中的实际数据。每个数据页的默认大小是16KB,可以通过配置进行修改,其中包含着表的行记录。
  • 索引页(Index Pages):用于存储表的索引数据结构,如 B+ 树索引。每个索引页的默认大小也是16KB,可以通过配置进行修改。索引页中包含了索引节点和指向下一层节点或数据页的指针。
  • BLOB页(Blob Pages):用于存储大型二进制对象(BLOB)数据,如图片、音频或视频文件等。BLOB 数据通常被分离存储在独立的页中,而不是与其他数据存储在同一个数据页中。
  • Undo页(Undo Pages):用于存储事务的回滚信息,以支持事务的回滚和并发控制。Undo 页记录了旧值和未提交事务的回滚信息。
  • 插入缓冲(Insert Buffer):虽然不是一种真正的页类型,但在 InnoDB 存储引擎中使用了插入缓冲来加速数据的插入操作。插入缓冲缓存了新插入的数据,然后按顺序批量地将数据插入到数据页中
  • 系统页(System Pages):用于存储 InnoDB 存储引擎的一些系统信息,例如表空间、事务信息等。
  • 刷新(Flush)页:用于将修改过的数据页刷新到磁盘上的物理数据文件中。
  • 压缩页(Compressed Pages):用于存储使用压缩算法进行压缩的数据。
  • 重做日志页(Redo Log Pages):用于存储 InnoDB 存储引擎的重做日志(Redo Log)信息。
  • 页面链表页(Page Directory Pages):用于存储页的目录信息,帮助管理和组织其他类型的页。
  • Page Cleaner 页(Page Cleaner Pages):用于执行后台任务,例如在 InnoDB 存储引擎中,Page Cleaner 负责回收已经使用过的数据页,以减少闲置页的数量。
  • Free Space Info 页(Free Space Info Pages):用于跟踪数据页的空闲空间信息,帮助优化数据页的利用率。
  • Change Buffer 页(Change Buffer Pages):用于延迟索引更新操作,在某些情况下通过 Change Buffer 缓存索引更新操作,以提高性能。

delete是真的把数据从磁盘中移除了吗?

并没有从磁盘中移除,只是标记为删除,更改了行中的元数据部分有一个叫做delete_mark的删除标记。
原因:
修改一个标志位的开销,比磁盘删除一条记录更快,当有大量数据需要删除时,如果移除磁盘数据,可能会导致所在的页为空页,删除大量的空页,仍旧是一个消耗资源的过程。。
倒不如直接软删除,当需要插入新数据时,存储引擎可以直接使用已经存在的空闲页,而不需要为新数据重新分配磁盘空间。

注意,truncate,会释放磁盘空间。

MySQL行格式有哪些?

  • DEFAULT:这是 InnoDB 存储引擎的默认行格式。在这种格式下,数据是以紧凑的格式存储的,适合一般的 OLTP 应用。
  • COMPRESSED:这是 InnoDB 存储引擎特有的一种行格式,在 MySQL 5.7 版本后提供。使用压缩的方式存储数据,可以减少存储空间的使用和提高性能。
    DYNAMIC:InnoDB 存储引擎也支持这种行格式,适用于包含大量可变长度列的表。数据存储比较灵活,既有利于节省空间,又能提高性能。
  • COMPACT:适用于 MyISAM 存储引擎的一种行格式,使用紧凑的格式存储数据。
  • FIXED:适用于 MyISAM 存储引擎的另一种行格式,所有列都用固定长度存储数据。
  • REDUNDANT:适用于 MyISAM 存储引擎的一种行格式,存储冗余信息以加快查询速度。

什么是行溢出?

行数据量超出所能容纳的最大值。
举例说明两种情况:
一个是设计表时:例如把varchar的长度设置为70000,则会报错column length too big for column ‘s’ (max = 16383); use Blob or TEXT instea.
一个是插入或更新数据时:数据内容超过表字段约定的最大长度引发的报错(严格模式)或完整截断(非严格模式)情况。

为什么varchar行溢出显示的是max=16383,而不是65535?

因为默认的使用utf8mb4的编码(最长占4个字节)),虽然utf8编码的字符是变长,但是需要保证每个字符占最大(4个字节)字节的情况下,能够存储进去。
16383*4 = 65532,其中用2个字节用于保存字段长度(2个字节占16位,216=65536),剩余2字节无法被4整除,余下的。

页与缓冲池的关系?

真正访问页之前,需要把磁盘上的页缓存到内存中的buffer pool中,所有的变更,也是先更新缓冲池,此时并没有持久化到磁盘,称之为脏页,然后脏页通过checkpoint机制去刷盘。

为什么不采用实时刷盘策略?

磁盘比内存慢,大规模的并发读写,实时刷盘,可能导致用户改了1个字节的数据,当前页就要实时刷盘到磁盘中,极大的降低效率,如果一条SQL影响范围很大,涉及多个页,多个页不连续,又会产生随机io,所以不可实时刷盘。

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

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

相关文章

Linux C/C++下使用Lex/Yacc构建实现DBMS(Minisql)

DBMS(数据库管理系统)是一种用于管理和组织数据库的软件系统。它的重要性在于提供了一种有效地存储、管理和访问大量数据的方式。本文将深入探讨如何使用C语言、Lex(词法分析器生成器)和Yacc(语法分析器生成器&#xf…

Linux安装MeterSphere并结合内网穿透实现公网远程访问本地服务

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

企业官网朝这个方向建设,保准你和客户双丰收!

“企业官网是一个没落的行业”,不少人都是这个论调,那是因为你没有经历过大起大落,大风大浪,躺在安乐窝舒服久了,就放弃了进步了。 提升企业官网的颜值和体验,是企业官网建设的未来之路。 随着互联网的发展…

商品上传上货搬家使用1688商品采集api接口

1688.item_get 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[yes,no…

如何在RTMP推送端和RTMP播放端支持Enhanced RTMP H.265(HEVC)

技术背景 时隔多年,在Enhancing RTMP, FLV With Additional Video Codecs And HDR Support(2023年7月31号正式发布)官方规范出来之前,如果RTMP要支持H.265,大家约定俗成的做法是扩展flv协议,CDN厂商携手给…

0103n阶行列式-行列式-线性代数

文章目录 一 n阶行列式二 三阶行列式三 特殊行列式结语 一 n阶行列式 ∣ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋯ ⋯ ⋯ ⋯ a n 1 a n 2 ⋯ a n n ∣ \begin{vmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\cdots&\cdots…

知名比特币质押协议项目Babylon确认参加Hack.Summit()2024区块链开发者大会

Babylon项目已确认将派遣其项目代表出席2024年在香港数码港举办的Hack.Summit()2024区块链开发者大会。作为比特币生态的领军项目,Babylon积极参与全球区块链领域的交流与合作,此次出席大会将为其提供一个展示项目进展、交流技术与创新思路的重要平台。B…

【MyBatis-Plus 常用注解详解】

文章目录 1. TableName2. TableId3. TableField4. Version5. TableLogic MyBatis-Plus(简称MP)是一个用于简化 MyBatis 操作的增强工具库,它在 MyBatis 的基础上扩展了一些功能,极大地提高了开发效率。 1. TableName TableName …

深入了解二叉搜索树:原理、实现与应用

目录 一、介绍二叉搜索树 二、二叉搜索树的基本性质 三、二叉搜索树的实现 四、总结 在计算机科学中,数据结构是构建算法和程序的基础。其中,二叉搜索树(Binary Search Tree,简称 BST)作为一种常见的数据结构&#…

【分布式】NCCL Split Tree kernel内实现情况 - 06

相关系列 【分布式】NCCL部署与测试 - 01 【分布式】入门级NCCL多机并行实践 - 02 【分布式】小白看Ring算法 - 03 【分布式】大模型分布式训练入门与实践 - 04 目录 相关系列概述1.1 Tree1.2 double binary tree初始化和拓扑2.1 Tree的初始化与差异2.2 ncclGetBtreeKernel内部…

序列的第 k 个数(c++题解)

题目描述 BSNY 在学等差数列和等比数列,当已知前三项时,就可以知道是等差数列还是等比数列。现在给你序列的前三项,这个序列要么是等差序列,要么是等比序列,你能求出第 m项的值吗。 如果第 项的值太大,对…

python的tqdm库不显示动态进度条的问题

python的tqdm库不显示动态进度条的问题 本质原因是tqdm无法获取内部对象的长度,这可能是因为内部对象是一个迭代器,问题经常发生在同时使用tqdm与enumerate的场合,例如深度学习中经常可能出现的: tqdm.tqdm(enumerate(train_loade…

Java开发从入门到精通(一):Java的进阶语法知识

Java大数据开发和安全开发 Java的方法1.1 方法是什么1.1.1 方法的定义1.1.2 方法如何执行?1.1.3 方法定义时注意点1.1.4 使用方法的好处是? 1.2 方法的多种形式1.2.1 无参数 无返回值1.2.2 有参数 无返回值 1.3 方法使用时的常见问题1.4 方法的设计案例1.4.1 计算1-n的和1.4.…

uniapp隐藏状态栏并强制横屏

uniapp隐藏状态栏并强制横屏 1.manifest.json中: "screenOrientation": ["landscape-primary", //可选,字符串类型,支持横屏"landscape-secondary" //可选,字符串类型,支持反向横屏]…

表单进阶(5)-文本域

默认文本框可以用自由拖动控制大小 通过设置在css中设置控制: resize:重新设置文本框大小 horizontal(水平),vertical(垂直),none(不能控制大小),默认both&…

部署LVS+Keepalived高可用群集(抢占模式,非抢占模式,延迟模式)

目录 一、LVSKeepalived高可用群集 1、实验环境 2、 主和备keepalived的配置 2.1 yum安装ipvsadm和keepalived工具 2.2 添加ip_vs模块并开启ipvsadm 2.3 修改keepalived的配置文件 2.4 调整proc响应参数,关闭linux内核的重定向参数响应 2.5 将主服务器的kee…

23 经典卷积神经网络 LeNet【李沐动手学深度学习v2课程笔记】 (备注:提到如何把代码从CPU改到在GPU上使用)

目录 1. LeNet 2. 实现代码 3. 模型训练 4. 小结 本节将介绍LeNet,它是最早发布的卷积神经网络之一,因其在计算机视觉任务中的高效性能而受到广泛关注。 这个模型是由AT&T贝尔实验室的研究员Yann LeCun在1989年提出的(并以其命名&…

【AIGC调研系列】GitHub Copilot提高接口自动化效率的使用技巧

GitHub Copilot 提高接口自动化效率的使用技巧主要包括以下几点: 让Copilot学习你的代码:通过清晰的层次结构、细致的拆分、规范的目录和文件命名以及合理的代码抽取,可以帮助Copilot更好地理解你的编码风格和需求[2]。设置Prompt和使用Prompt Engineering:通过设置合适的P…

【2024年5月备考新增】《软考真题分章练习(答案解析) - 1 项目管理一般知识(高项)》

点击跳转本章无答案版 1、关于项目管理的描述,不正确的是:()。 A.项目管理的主要目的是实现企业管理目标 B.在项目管理中,时间是一种特殊的资源 C.项目管理的职能是对资源进行计划、组织、指挥、协调、控制 D.项目管理把各种知识、技能、手段和技术应用于项目活动项目管理…

HTML三识

表单标签 表单&#xff1a;在网页中主要负责数据采集功能&#xff0c;使用<form>标签定义表单表单项(元素)&#xff1a;不同类型的input元素&#xff0c;下拉列表&#xff0c;文本域等 标签描述<form>定义表单<input>定义表单项&#xff0c;通过type属性控…