【MySQL】页结构详解:页的大小、分类、头尾信息、数据行、查询、记录及数据页的完整结构

📢博客主页:https://blog.csdn.net/2301_779549673
📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 JohnKi 原创,首发于 CSDN🙉
📢未来很长,值得我们全力奔赴更美好的生活✨

在这里插入图片描述

在这里插入图片描述

文章目录

  • 🏳️‍🌈一、页的大小可以设置吗?
  • 🏳️‍🌈二、页都有哪些分类? 我们需要重点学习哪种页?
  • 🏳️‍🌈三、页头和页尾具体包含了哪些信息?
    • 3.1 页头 - File Header
    • 3.2 页尾-File Trailer
    • 3.3 什么是 LSN
    • 3.4 除了页头和页尾,数据页中还有哪些信息?
    • 3.5 页主体中包含哪些信息?
  • 🏳️‍🌈四、数据行有哪些信息组成?
    • 4.1 数据行是如何组织在一起的?
    • 4.2 怎么标识新页中的第一行和最后一行?
    • 4.3 当向一个新页插入数据时是如何执行的?
  • 🏳️‍🌈五、如果要查询的数据在某一个页中,如何定位它在页中的位置,一条条遍历吗?
    • 5.1 一条条遍历的查询效率高不高?
    • 5.2 如何提高页内的查询效率?页目录
  • 🏳️‍🌈六、关于事务、索引这些信息在页中怎么记录?
  • 🏳️‍🌈七、数据页的完整结构是什么样的?
  • 👥总结


11111111
11111111
11111111
11111111
**** 11111111

MySQL 运行的过程中起到了非常重要的作用,为了能发挥更好的性能,可以结合自己系统的业务场景和数据大小,对页相关的系统变量进行调整,页的大小就是一个非常重要的调整项。同时关于页的结构也要有所了解,以后介绍的索引原理也是基于页实现的。

首先来看关于页的几个问题。

🏳️‍🌈一、页的大小可以设置吗?

  • 前面介绍了每个数据页默认为 16KB ,是操作系统"数据块"4KB的整数倍,那么只要保证页的大小是操作系统"数据块"大小的整数倍是不是也可以呢,答案是肯定的
  • MySQL提供了一个专门的系统变量来控制页的大小,可以通过系统变量 innodb_page_size 进行调整与查看,在调整页大小的时候需要保证设置的值是操作系统"数据块"4KB的整数倍,从而保证通过操作系统和磁盘交互时"数据块"的完整性,不被分割或浪费,所以规定了innodb_page_size可以设置的值,分别是4096、8192、16384、3276865536,对应4KB、8KB、16KB、32KB、64KB。

解答问题

可以通过系统变量 innodb_page_size 进行调整与查看,但要保证设置的值是操作系统 "数据块"4KB 的整数倍,MySQL规定 innodb_page_size 可以设置的值,分别是 40968192、16384、65536,对应4KB、32768、8KB、16KB、32KB、64KB

🏳️‍🌈二、页都有哪些分类? 我们需要重点学习哪种页?

  • InnoDB在不同的使用场景定义多种不同类型的页,常用的有数据页、Undo Log页Change Buffer页Extent Descriptor(XDES)页InnoDB段信息页 等,每种页的数据结构都不相同,其中最需要我们关注的就是数据页
  • 由于 InnoDB 中有个概念叫 “索引即数据”,所以也叫做索引页
  • 不论哪种类型的页都具有 页头(File Header)页尾(File Trailer) 两个信息

🏳️‍🌈三、页头和页尾具体包含了哪些信息?

页头 和 页尾 中包含的是 用来描述文件相关的信息,如下图所示

在这里插入图片描述
在这里插入图片描述

3.1 页头 - File Header

  • 页号: FIL_PAGE_OFFSET 占用 4Byte,相当于页的身份证号,通过这个长度可以计算出每个InnoDB表中最多可以拥有 2(4*8)-1约42亿 个页,表空间第一个页编号从0开始,之后的页号分别是1,2,3…依此类推,具体页的偏移量计算公式为: 页号 * 每页大小; 那么按照每个页默认16KB大小计算,一个表空间最大容量为2(4*8)*16KB= 64TB,这也是InnoDB表空间最大容量是64T的原因;
  • 上一页页号: FIL_PAGE PREV
  • 下一页页号: FIL_PAGE_NEXT 多个页通过这两个信息组成双向链表,即使不同的页地址不连续,也可以通过链表连接
  • 表空间ID: FIL PAGE_ARCH_LOG_NO_OR_SPACE_ID当前页属于哪个表空间
  • 页类型: FIL_PAGE_TYPE数据页对应的页类型是 FIL_PAGEINDEX=0x45BF
  • 最近一次修改的LSN: FIL_PAGE_LSN,占用 8Byte
  • 已被刷到磁盘的LSN: FIL_PAGE_FILE_FLUSH_LSN,占用 8Byte
  • 校验和: FILPAGELSPACE_OR_CHKSUM用于页的完整性校验

3.2 页尾-File Trailer

  • 近一次修改的LSN
  • 校验和: 对应页头中的校验和

如果在数据传输的过程中数据丢失或异常中断,导致一个数据页不完整 可以通过 页头页尾校验和 进行验证,验证算法默认使用 CRC32

3.3 什么是 LSN

LSN: 是"Log Sequence Number"的缩写,表示日志序号。用 一个任意的、不断增加的值 表示日志中记录的操作对应的时间点,用 8字节的无符号长整形 表示,后面会详细介绍如何生成LSN的值

3.4 除了页头和页尾,数据页中还有哪些信息?

页头和页尾中的各个字段描述了当前页的类型以及在文件系统中的位置,也就是说通过页头可以找到对应的页。数据页的主要功能是保存数据,在一个数据页中,除了页头与页尾占用的46个字节之外的空间都用来存储真正的数据,也就是 数据行

数据行会与表里的数据行一一对应,基于这一特性MySQL也被称为"行式数据库”,也可以把除了页头页尾的区域称为页主体

3.5 页主体中包含哪些信息?

页主体中的信息都是和数据相关的,

  • 其中包括刚才提到了 数据行
  • 还有为了提高查询效率的页目Page Directory
  • 为了方便操作和管理数据页的数据页头 Page Header

这又是三个非常重要的概念,接下来我们逐个讨论。

🏳️‍🌈四、数据行有哪些信息组成?

数据行主要存储真实数据,为了方便数据的管理与描述,InnoDB在每个数据行中还添加了一些额外(管理)信息,于是每一个 DYNAMIC 数据行都可以划分为两部分,一部分存储额外信息,一部分存储真实数据

额外信息部分包含 变长字段长度列表NULL值列表 两个大小不确定的区域,以及固定占5字节及40BIT的头信息区域

头信息 中存储了行的基本信息,包括行在 页内的位置heap_no行类型 record_type下一行的地址偏移量 next_record 等6项信息,

如下图所示:

在这里插入图片描述
总结

  • 数据行可以划分为两部分,一部分存储额外信息,一部分存储真实数据
  • 额外信息部分 包含 变长字段长度列表NULL值列表 两个大小不确定的区域,以及固定占5字节的头信息区域

4.1 数据行是如何组织在一起的?

数据行通过下一行的地址偏移量,即 next_record 将页内所有数据行组成了一个单向链表

这里要注意的是,地址偏移量 指向的是 下一行中真实数据的起始地址,这样做的好处是,向右是真实数据,向左就是头信息,而无需额外的长度计算,如图所示:

在这里插入图片描述

在这里插入图片描述

4.2 怎么标识新页中的第一行和最后一行?

了解了行的基本结构和组织方式之后,那么当遍历页中的行时,从哪里开始到哪里结束呢?

为了解决这个问题,每当创建一个新页,都会自动分配两个行,

  • 一个是行类型为2的 最小行 Infimun, heap_no 位置固定为0号
  • 一个是行类型为3的 最大行 Supremun, heap_no 位置固定为1号

这两个行并不存储任何真实信息,而是做为数据行链表的头和尾

虽然不存储真实数据,但它们的数据结构和真实数据行完全一致,只不过数据区域存储的是代表它们身份的固定字符串 InfimunSupremun,新页中没有数据时,最小行 Infimunnext record 直接连接最大行 Supremun最大行不连接任何行,它的 next_record0

在这里插入图片描述

4.3 当向一个新页插入数据时是如何执行的?

当向一个新页插入数据时,heap_no 会 从2号开始递增,表示当前记录在页面堆中的相对位置;

  • 如果是真实数据record_type0
  • 如果是索引目录(B+树非叶节点)数据则 record_type1

再将 Infimun 连接第一个数据行,最后一行真实数据行连接 Supremun这样数据行就构建成了一个单向链表

更多的行数据插入后,会按照主键从小到大的顺序进行链接;

为了使页的结构更加清晰,通常

  • 将页中有数据行的区域称为 用户数据区 userRecords
  • 把未被数据行占用的区域称为 空闲区Free Space

如下图所示:

在这里插入图片描述

🏳️‍🌈五、如果要查询的数据在某一个页中,如何定位它在页中的位置,一条条遍历吗?

当然不是,InnoDB使用了另一种方式,更高效的查询数据,下面我们分析一下。

5.1 一条条遍历的查询效率高不高?

从头开始遍历是一个最简单的方法,也可以实现数据的查找,当按主键或索引查找某条数据时,从头行 infimun 开始,沿着链表顺序逐个比对查找,但一个页有16KB,通常会存在数百行数据,每次都要遍历数百行,无法满足高效查询。

5.2 如何提高页内的查询效率?页目录

为了提高查询效率,InnoDB 采用 二分查找 来解决查询效率问题。

具体实现方式是,在每一个页中加入一个叫做 页目录 Page Directory 的结构将页内包括头行、尾行在内的所有行进行分组,约定头行单独为一组其他每个组最多8条数据,同时把每个组最后一行在页中的地址,按主键从小到大的顺序记录在页目录中

页目录中的每一个位置称为一个,每个槽都对应了一个分组,这样在插入数据行完成链接后,一旦最后一个分组中的数据行超过分组的上限8个时,就会分裂出一个新的分组,为了快速判断每个分组是否达到了8个的上限,在每个分组最后一行中用 n_owned 记录了这个分组内的行数,与此同时在页目录中创建一个新的槽,后续插入的行都遵守这个规则;

后续在查询某行时,就可以通过二分查找,先找到对应的槽,然后在槽内最多8个数据行中进行历即可,从而大幅提高了查询效率;

例如要查找主键为6的行,先比对槽中记录的主键值,定位到最后一个槽2,再从最后一个槽中的第一条记录遍历,第二条记录就是我们要查询的目标行。
在这里插入图片描述

🏳️‍🌈六、关于事务、索引这些信息在页中怎么记录?

在这里插入图片描述

🏳️‍🌈七、数据页的完整结构是什么样的?

这个问题是对页结构的总结性描述,这里也用一张图就可以明确的表示出页结构的整体信息
注意: 这里讲的是 InnoDB 的数据页结构,和 MyISAM 的页结构有所不同

在这里插入图片描述


👥总结

本篇博文对 【MySQL】页结构详解:页的大小、分类、头尾信息、数据行、查询、记录及数据页的完整结构 做了一个较为详细的介绍,不知道对你有没有帮助呢

觉得博主写得还不错的三连支持下吧!会继续努力的~

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

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

相关文章

【FreeRTOS】基于G431+Cubemx自用笔记

系列文章目录 留空 文章目录 系列文章目录前言一、从头开始创建一个FreeRTOS工程1.1 在 "Timebase Source" 中,选择其他TIM1.2 配置FreeRTOS的参数1. 3 添加任务 二、动态任务的创建/删除2.1 函数介绍2.1.1 创建动态任务xTaskCreate()2.1.2 创建静态任务…

LVGL(lv_bar进度条)

文章目录 一、lv_bar 是什么?二、基本使用创建一个进度条设置进度值 三、条形方向与填充方向四、范围模式(Range)五、事件处理(可选)六、自定义样式(可选)七、综合示例八、配合 lv_timer 或外部…

AI对话小技巧

角色设定:擅于使用 System 给 GPT 设定角色和任务,如“哲学大师"指令注入:在 System 中注入常驻任务指令,如“主题创作"问题拆解:将复杂问题拆解成的子问题,分步骤执行,如&#xff1a…

C++ 核心基础:数字、数组、字符串、指针与引用详解

C++ 核心基础:数字、数组、字符串、指针与引用详解 1. C++ 基础语法1.1 标识符与保留字1.2 数据类型概述1.3 基本输入输出2.1 基本整数类型(int、short、long、long long)2.2 无符号整数类型(unsigned int、unsigned short、unsigned long、unsigned long long)2.3 整数类…

HarmonyOS运动开发:如何集成百度地图SDK、运动跟随与运动公里数记录

前言 在开发运动类应用时,集成地图功能以及实时记录运动轨迹和公里数是核心需求之一。本文将详细介绍如何在 HarmonyOS 应用中集成百度地图 SDK,实现运动跟随以及运动公里数的记录。 一、集成百度地图 SDK 1.引入依赖 首先,需要在项目的文…

如何理解k8s中的controller

一、基本概念 在k8s中,Controller(控制器)是核心组件之一,其负责维护集群状态并确保集群内的实际状态与期望状态一致的一类组件。控制器通过观察集群的当前状态并将其与用户定义的期望状态进行对比,做出相应的调整来实…

《Go小技巧易错点100例》第三十二篇

本期分享: 1.sync.Map的原理和使用方式 2.实现有序的Map sync.Map的原理和使用方式 sync.Map的底层结构是通过读写分离和无锁读设计实现高并发安全: 1)双存储结构: 包含原子化的 read(只读缓存,无锁快…

【MySQL】行结构详解:InnoDb支持格式、如何存储、头信息区域、Null列表、变长字段以及与其他格式的对比

📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…

LabVIEW多通道并行数据存储系统

在工业自动化监测、航空航天测试、生物医学信号采集等领域,常常需要对多个传感器通道的数据进行同步采集,并根据后续分析需求以不同采样率保存特定通道组合。传统单线程数据存储方案难以满足实时性和资源利用效率的要求,因此设计一个高效的多…

【Linux系列】bash_profile 与 zshrc 的编辑与加载

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

针对Mkdocs部署到Githubpages加速访问速度的一些心得

加速网站访问的一些心得 在使用 MkDocs 构建网站时,为了提高访问速度,我们可以采取以下一些措施: 1. 优化图片 使用合适的图片格式,如 WebP、JPEG2000 等,减少图片文件大小,从而加快加载速度。 可以使用…

Mysql中切割字符串作为in的查询条件

问题:需要将一个字符串切割成数组作为in的查询条件,如: select * from table_1 where name in (select slit(names) from table_2 where id 3); names 返回的格式是’name1,name2,name3…,需要将name按照逗号切割作为in的查询条件&#xff1b…

云计算中的虚拟化:成本节省、可扩展性与灾难恢复的完美结合

云计算中虚拟化的 4 大优势 1. 成本效益 从本质上讲,虚拟化最大限度地减少了硬件蔓延。团队可以将多个虚拟机整合到单个物理主机上,而不是为每个工作负载部署单独的服务器。这大大减少了前期硬件投资和持续维护。 结果如何?更低的功耗、更低…

Linux : 多线程【线程概念】

Linux : 多线程【线程概念】 (一)线程概念线程是什么用户层的线程linux中PID与LWP的关系 (二) 进程地址空间页表(三) 线程总结线程的优点线程的缺点线程异常线程用途 (一)线程概念 线程是什么 在一个程序里的一个执行…

IDEA转战TREA AI IDE : springboot+maven+vue项目配置

一、trea下载安装 Trae官方网址: https://www.trae.com.cn/ Trae官方文档:https://docs.trae.com.cn/docs/what-is-trae?_langzh w3cschool: https://www.w3cschool.cn/traedocs/ai-settings.html 安装这里省略,正常安装即可。…

Java--图书管理系统(简易版)

目录 目录 前言 🔔1.library包 1.1 Book类 1.2 BookList类 🔔2.user包 2.1User类(父类) 2.2Admin(管理员) 2.3 NormalUser(普通用户) 🔔3.Operation包 🕐3.1 IOperation接口 🕑3.2ListOperation(查看操作)…

深入浅出:Spring Boot 中 RestTemplate 的完整使用指南

在分布式系统开发中,服务间通信是常见需求。作为 Spring 框架的重要组件,RestTemplate 为开发者提供了简洁优雅的 HTTP 客户端解决方案。本文将从零开始讲解 RestTemplate 的核心用法,并附赠真实地图 API 对接案例。 一、环境准备 在 Spring…

大数据处理利器:Hadoop 入门指南

一、Hadoop 是什么?—— 分布式计算的基石 在大数据时代,处理海量数据需要强大的技术支撑,Hadoop 应运而生。Apache Hadoop 是一个开源的分布式计算框架,致力于为大规模数据集提供可靠、可扩展的分布式处理能力。其核心设计理念是…

685SJBH计量管理系统

摘 要 计量,在我国已有五千年的历史。计量的发展与社会进步联系在一起,它是人类文明的重要组成部分。它的发展经历了古典阶段、经典阶段和现代阶段。而企业的计量管理是对测量数据、测量过程和测量设备的管理。 本系统通过分析现有计量系统的业务逻辑…