解读InnoDB数据库索引页与数据行的紧密关联

目录

一、快速走进索引页结构

(一)整体展示说明

(二)内容说明

File Header(文件头部)

Page Header(页面头部)

Infimum + Supremum(最小记录和最大记录)

User Records(用户记录)

 Free Space(空闲空间)

Page Directory(页面目录)

File Trailer(文件尾部)

二、索引页与记录行的简单关系说明

(一)数据页的双向链表结构

(二)记录行的单向链表结构

三、InnoDB 数据页中的 User Records 与 Free Space

(一)页满前的处理

初始状态

存储过程

(二)页满后的处理

主要参考和学习来源


干货分享,感谢您的阅读!快速了解索引页结构和数据行的直接关系。前提知识如下:

文章说明具体链接

数据行格式内容分析

探究InnoDB Compact行格式背后-CSDN博客
数据行头信息各个属性探究解析MYSQL行头信息数据行格式分析_jdk 协程-CSDN博客
解析数据行内部单向链表策略数据库记录行在页内查询探索分析_检查代码中循环依赖-CSDN博客

一、快速走进索引页结构

在InnoDB存储引擎的世界里,数据存储和管理就像是一座繁忙而有序的城市。在这座城市中,每一块16KB大小的土地都被称为一个“页”(Page),而这些页是城市基础设施的核心,其主角就是“索引页”(INDEX页),这些页专门用于存储我们表中的实际记录数据,因此也被称为“数据页”(Data Page)。

(一)整体展示说明

索引页就像是城市中的一栋多层大厦。这栋大厦不仅要存放数据,还需要具备高效的检索功能。为了达到这个目的,InnoDB使用了一种高效的B+树结构,每个索引页就是这棵大树上的一个节点。索引页的大小固定为16KB,这个大小经过优化,既能高效利用磁盘空间,又能在内存中快速读取。整体页展示如下:

在这栋大厦中,各个部分各司其职,确保数据的高效存储和快速访问。File Header是大厦的门卫,Page Header是楼层管理,Infimum和Supremum是地基和天花板,User Records是居民,Free Space是预留的空房间,Page Directory是导航系统,File Trailer是安防系统。

(二)内容说明

File Header(文件头部)

占用空间38 字节,文件头部存储了页的一些基础信息:

  • Page Type(页类型):标识该页的类型(如数据页、索引页)。
  • Page Number(页号):当前页在表空间中的唯一编号。
  • Checksum(校验和):用于检测页在读写过程中的完整性。

具像化理解:就像是办公楼的铭牌,记录了楼的基本信息和身份标识。

Page Header(页面头部)

占用空间56 字节,页面头部包含数据页特有的信息:

  • Number of Records(记录数量):当前页中存储的记录数量。
  • Free Space Pointer(空闲空间指针):指向页中第一个可用的空闲空间位置。
  • Heap Top(堆顶位置):记录当前页中数据存储的最高位置。
  • Page Level(页级别):表示当前页在 B+ 树中的层级。

具像化理解:相当于楼的管理办公室,记录了楼内的各种管理信息,如有多少办公室空闲。

Infimum + Supremum(最小记录和最大记录)

占用空间26 字节,这两个虚拟记录用于定义页中的记录范围:

  • Infimum Record(最小记录):一个特殊的最小记录,用于标示页的起始。
  • Supremum Record(最大记录):一个特殊的最大记录,用于标示页的结束。

具像化理解:类似楼的基础和屋顶,标示了楼的起点和终点。

User Records(用户记录)

占用空间不确定,实际存储的用户数据记录:

  • Record Header(记录头部):包含记录的元数据,例如记录长度和下一条记录的指针。
  • Record Data(记录数据):实际的数据内容,包括各字段的值。

具像化理解:实际的办公室,里面有员工在工作,记录了具体的数据内容。

 Free Space(空闲空间)

占用空间不确定,空闲空间用于存储新插入的记录,随着记录的插入,空闲空间逐渐减少:

  • Insertions(插入):当有新记录插入时,系统会在此区域寻找合适的空闲位置。
  • Deletions(删除):删除记录后,空间会返回到空闲区域供新记录使用。

具像化理解:尚未出租的办公室,未来可以容纳新的员工(数据)。

Page Directory(页面目录)

占用空间不确定,页面目录包含记录的相对位置,用于快速检索记录:

  • Directory Slots(目录槽):指向页中各记录的位置,便于快速定位和检索。
  • Efficiency(效率):通过目录可以快速定位记录,提高检索效率。

具像化理解:大楼的导览图,帮助快速找到特定的办公室(记录)。

File Trailer(文件尾部)

占用空间8 字节,文件尾部包含校验信息,用于验证页的完整性:

  • Checksum(校验和):再次验证页的数据完整性,确保数据在读写过程中未被破坏。

具像化理解:大楼的安保系统,确保大楼的安全和完整性。

二、索引页与记录行的简单关系说明

在 InnoDB 中,数据页通过双向链表连接,每个数据页内的记录行按照主键值从小到大的顺序组成单向链表,并且每个数据页都有一个页目录用于快速定位记录。

查找记录时,先在页目录中使用二分法定位到特定槽,再在该槽对应的记录组中顺序遍历找到目标记录。通过这种设计,InnoDB 能够高效地管理和查找数据,确保数据库系统的高性能和可靠性。

(一)数据页的双向链表结构

每个数据页被组织成一个双向链表,这意味着每个数据页都有指向前一个页和后一个页的指针(File Header 记录了页的基础信息和链表指针)。通过这种双向链表结构,InnoDB 可以方便地进行数据页的插入、删除和遍历操作。这种设计保证了数据页之间的高效连接和管理。

(二)记录行的单向链表结构

在每个数据页中,记录行按照主键值从小到大的顺序组织成一个单向链表。这种有序的结构使得在数据页内查找记录变得更加高效。每条记录不仅存储了自身的数据,还包含指向下一条记录的指针,这样可以顺序遍历记录。

每个数据页都有一个页目录,页目录可以看作是数据页内的索引结构。页目录将记录分成多个组,每个组在页目录中都有一个槽。通过页目录,InnoDB 可以快速定位到特定记录所在的组,从而减少遍历记录的时间。

当需要通过主键查找某条记录时,InnoDB 会先在页目录中使用二分法快速定位到对应的槽。页目录中的槽指向该槽对应的记录组,接着在该组中遍历记录,直到找到目标记录。这种查找过程结合了二分查找和顺序遍历的优点,既高效又精确。

三、InnoDB 数据页中的 User Records 与 Free Space

InnoDB 数据页中的 User Records 和 Free Space 部分密切相关。随着记录的不断插入,Free Space 部分的空间会逐渐分配给 User Records 部分,直到 Free Space 被完全消耗。当一个数据页满了之后,InnoDB 会申请新的数据页并将其链接到现有的双向链表中,继续存储新的记录。也就是在页未满前页的存储主要在User Records 和 Free Space发生,页满后将触达到双向链表页中。

(一)页满前的处理

初始状态
  • User Records:初始为空,没有实际数据存储。
  • Free Space:占据大部分页空间,等待新记录的插入。
存储过程
  • 记录插入:当用户插入一条记录时,系统会从 Free Space 部分中申请一个合适大小的空间用于存储这条记录。这条记录被存储到 User Records 部分。
  • 空间调整:随着记录的插入,User Records 部分逐渐增大,存储越来越多的用户数据。同时,Free Space 部分的可用空间减少,逐步被 User Records 部分替代。
  • 页满状态:当 Free Space 部分被完全消耗,整个数据页被 User Records 部分占据,意味着该页已满,无法再存储新的记录。

(二)页满后的处理

当一个数据页中的 Free Space 部分被完全替代为 User Records 部分后,该页就被认为已满。此时,InnoDB 会执行以下操作:

  1. 申请新的数据页:数据库引擎会在表空间中申请一个新的数据页,以继续存储新的记录。
  2. 更新链表指针:新申请的数据页会被链接到现有的数据页双向链表中,确保数据页之间的有序连接。
  3. 维护 B+ 树结构:如果涉及到索引页,InnoDB 会维护 B+ 树结构,确保新的数据页在树中的正确位置。

主要参考和学习来源

《MySQL 是怎样运行的:从根儿上理解 MySQL》

MySQL InnoDB 索引 (INDEX) 页结构 - doubtful - 博客园

https://juejin.cn/post/7216914115260301367

mysql数据页和索引页 | Young 小站

一文带你了解MySQL之InnoDB 数据页结构-阿里云开发者社区

https://www.51cto.com/article/702315.html

Mysql之InnoDB数据页(索引页)结构解析 流程图模板_ProcessOn思维导图、流程图

这样理解Mysql索引,阿里面试官也给你点赞_MySQL_慕枫技术笔记_InfoQ写作社区

https://www.51cto.com/article/777873.html

MySQL怎么运行的系列(四)Innodb索引结构和方案-张柏沛IT博客

InnoDB的Page结构 | JieSunn - BLOG

【MySQL】InnoDB行格式、数据页结构以及索引底层原理分析_牛客博客

27丨从数据页的角度理解B+树查询-SQL必知必会-极客时间

OceanBase 社区

页和区体系结构指南 - SQL Server | Microsoft Learn

MySQL InnoDB 聚集索引数据结构 | ellendan

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

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

相关文章

Excel如何把两列数据合并成一列,4种方法

Excel如何把两列数据合并成一列,4种方法 参考链接:https://baijiahao.baidu.com/s?id=1786337572531105925&wfr=spider&for=pc 在Excel中,有时候需要把两列或者多列数据合并到一列中,下面介绍4种常见方法,并且提示一些使用注意事项,总有一种方法符合你的要求:…

uniApp项目运行到鸿蒙手机,应用图标一直是H,应用名一直是HBuilder问题

项目运行到鸿蒙手机,应用图标一直是H,应用名一直是HBuilder问题 应用运行到鸿蒙手机和鸿蒙模拟器,应用图标一直是H,应用名一直是HBuilder,在自动生成的harmony-configs文件夹下也没有配置的文件, 这时候需要你将DevEco Studio 下…

uniapp 自定义加载组件,全屏加载,局部加载 (微信小程序)

效果图 全屏加载 页面加载使用 局部加载 列表加载里面使用 使用gif html <template><view><view class"" v-if"typeFullScreen"><view class"loading" v-if"show"><view class""><i…

鸿蒙实战:使用隐式Want启动Ability

文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙应用项目2.2 修改Index.ets代码2.3 创建LuzhouAbility2.4 创建Luzhou页面2.5 设置模块配置文件 3. 测试效果4. 实战总结 1. 实战概述 本次鸿蒙应用实战&#xff0c;先创建项目“ImplicitWantStartAbility”&#xff0c;接着修改In…

NLP论文速读(多伦多大学)|利用人类偏好校准来调整机器翻译的元指标

论文速读|MetaMetrics-MT: Tuning Meta-Metrics for Machine Translation via Human Preference Calibration 论文信息&#xff1a; 简介&#xff1a; 本文的背景是机器翻译&#xff08;MT&#xff09;任务的评估。在机器翻译领域&#xff0c;由于不同场景和语言对的需求差异&a…

AJAX学习(24.11.1-24.11.14)(包含HTTP协议)

AJAX学习&#xff08;24.11.1-11.14) 来源&#xff1a; 传智 | 高校学习平台-首页 传智播课&#xff1a;黑马程序员 1.服务器和客户端 1.服务器&#xff1a;存放和对外提供资源的电脑。 2.客户端&#xff08;用户&#xff09;&#xff1a;获取和消费资源的电脑。&#xff0…

好用的js组件库

lodash https://www.lodashjs.com/https://www.lodashjs.com/ uuid 用于生成随机数&#xff0c;常用于生成id标识 GitHub - uuidjs/uuid: Generate RFC-compliant UUIDs in JavaScripthttps://github.com/uuidjs/uuid dayjs 常用于时间的处理 安装 | Day.js中文网 (fenxi…

基于麒麟服务器操作系统V10版本,部署Nginx服务、MySql服务搭建PHP环境,实现静态网站平台的搭建。

一、环境准备 关闭防火墙。 查看当前防火墙的状态 systemctl status firewalld Copy 如果防火墙的状态参数是inactive,则防火墙为关闭状态。 如果防火墙的状态参数是active,则防火墙为开启状态。 关闭防火墙。 如果您想临时关闭防火墙,需要运行以下命令: systemctl…

[JavaWeb] 尚硅谷JavaWeb课程笔记

1 Tomcat服务器 Tomcat目录结构 bin&#xff1a;该目录下存放的是二进制可执行文件&#xff0c;如果是安装版&#xff0c;那么这个目录下会有两个exe文件&#xff1a;tomcat10.exe、tomcat10w.exe&#xff0c;前者是在控制台下启动Tomcat&#xff0c;后者是弹出GUI窗口启动To…

SRP 实现 Cook-Torrance BRDF

写的很乱&#xff01; BRDF&#xff08;Bidirectional Reflectance Distribution Function&#xff09;全称双向反射分布函数。辐射量单位非常多&#xff0c;这里为方便直观理解&#xff0c;会用非常不严谨的光照强度来解释说明。 BRDF光照模型&#xff0c;上反射率公式&#…

向量数据库FAISS之五:原理(LSH、PQ、HNSW、IVF)

1.Locality Sensitive Hashing (LSH) 使用 Shingling MinHashing 进行查找 左侧是字典&#xff0c;右侧是 LSH。目的是把足够相似的索引放在同一个桶内。 LSH 有很多的版本&#xff0c;很灵活&#xff0c;这里先介绍第一个版本&#xff0c;也是原始版本 Shingling one-hot …

基于YOLOv8深度学习的无人机航拍小目标检测系统(PyQt5界面+数据集+训练代码)

本研究提出并实现了一种基于YOLOv8深度学习模型的无人机航拍小目标检测系统&#xff0c;旨在解决高空环境下汽车目标检测的技术难题。随着无人机技术的发展&#xff0c;航拍图像已广泛应用于交通监控、城市管理、灾害应急等多个领域。然而&#xff0c;由于无人机通常在较高的飞…

LeetCode 热题 100 回顾

目录 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 2.字母异位词分组 &#xff08;中等&#xff09; 3.最长连续序列 &#xff08;中等&#xff09; 二、双指针部分 4.移动零 &#xff08;简单&#xff09; 5.盛最多水的容器 &#xff08;中等&#xff09; 6…

使用 PyTorch 实现 ZFNet 进行 MNIST 图像分类

在本篇博客中&#xff0c;我们将通过两个主要部分来演示如何使用 PyTorch 实现 ZFNet&#xff0c;并在 MNIST 数据集上进行训练和测试。ZFNet&#xff08;ZFNet&#xff09;是基于卷积神经网络&#xff08;CNN&#xff09;的图像分类模型&#xff0c;广泛用于图像识别任务。 环…

【计算机网络实验】之静态路由配置

【计算机网络实验】之静态路由配置 实验题目实验目的实验任务实验设备实验环境实验步骤路由器配置设置静态路由测试路由器之间的连通性配置主机PC的IP测试 实验题目 静态路由协议的配置 实验目的 熟悉路由器工作原理和机制&#xff1b;巩固静态路由理论&#xff1b;设计简单…

driver.js实现页面操作指引

概述 在访问某些网站的时候&#xff0c;第一次进去你会发现有个操作指引&#xff0c;本文引用driver.js&#xff0c;教你在你的页面也加入这般高大上的操作指引。 实现效果 实现 driver.js简介 driver.js是一个功能强大且高度可定制的基于原生JavaScript开发的新用户引导库…

无人机航测技术算法概述!

一、核心技术 传感器技术&#xff1a; GPS/GLONASS&#xff1a;无人机通过卫星定位系统实现高精度的飞行控制和数据采集。 高清相机&#xff1a;用于拍摄地面图像&#xff0c;通过后续图像处理生成三维模型。 激光雷达&#xff08;LiDAR&#xff09;&#xff1a;通过激光扫…

Docker 基础命令介绍和常见报错解决

介绍一些 docker 可能用到的基础命令&#xff0c;并解决三个常见报错&#xff1a; 权限被拒绝&#xff08;Permission Denied&#xff09;无法连接到 Docker 仓库&#xff08;Timeout Exceeded&#xff09;磁盘空间不足&#xff08;No Space Left on Device&#xff09; 命令以…

Java RPC框架的接口预热原理及无损实现

&#x1f680; 博主介绍&#xff1a;大家好&#xff0c;我是无休居士&#xff01;一枚任职于一线Top3互联网大厂的Java开发工程师&#xff01; &#x1f680; &#x1f31f; 在这里&#xff0c;你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人&#xff0c;我不仅热衷…

java的强,软,弱,虚引用介绍以及应用

写在前面 本文看下Java的强&#xff0c;软&#xff0c;弱&#xff0c;虚引用相关内容。 1&#xff1a;各种引用介绍 顶层类是java.lang.ref.Reference,注意是一个抽象类&#xff0c;而不是接口&#xff0c;其中比较重要的引用队列ReferenceQueue就在该类中定义&#xff0c;子…