当前位置: 首页 > news >正文

解读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》

https://www.cnblogs.com/dbf-/p/11891530.html

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

相关文章:

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

目录 一、快速走进索引页结构 (一)整体展示说明 (二)内容说明 File Header(文件头部) Page Header(页面头部) Infimum Supremum(最小记录和最大记录) …...

以数据编织,重构数据管理新范式

大数据产业创新服务媒体 ——聚焦数据 改变商业 人工智能几乎统一了全球最顶尖科技公司的认知:这个时代,除了AI,没有第二条路可走。 人工智能的技术逻辑颇有一种“暴力美学”,它依托于海量大数据和超高算力的训练和推理&#xff…...

在linux x86服务器安装jdk

安装JDK(Java Development Kit)在Linux x86 服务器上可以按照以下步骤进行操作。以下步骤假设你有root权限或者sudo权限。 1. 下载JDK安装包 首先,你需要从Oracle官网或者OpenJDK官网下载JDK的安装包。可以选择对应的版本,比如J…...

2024智慧竞技游戏俱乐部线下面临倒闭?

在2024年的中国,智慧竞技游戏俱乐部如雨后春笋般在二三线城市中兴起,它们不仅是年轻人娱乐的场所,更是智慧与技巧的较量场。然而,随着疫情的冲击,这些俱乐部面临着前所未有的挑战。本文将通过一个小镇上的故事&#xf…...

jmeter分布式(四)

一、gui jmeter的gui主要用来调试脚本 1、先gui创建脚本 先做一个脚本 演示:如何做混合场景的脚本? 用211的业务比例 ①启动数据库服务 数据库服务:包括mysql、redis mysql端口默认3306 netstat -lntp | grep 3306处于监听状态&#xf…...

如何解决手机游戏因IP代理被封禁无法正常游戏的问题?

在当前的网络环境下,许多手机游戏为了维护游戏的公平性和安全性,会采取措施对使用IP代理的玩家进行封禁,导致他们无法正常访问游戏。这种情况对于一些需要使用IP代理的用户来说可能显得很棘手,但实际上有几种技术性的解决方案可以…...

windows10 安装Anaconda

文章目录 1. 下载2. 安装3. 配置环境变量4. 检查是否安装成功 1. 下载 官网下载 https://www.anaconda.com/download 下载的最新版本,要求python的版本也高一些 清华大学开源软件镜像站 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 所有版本在这个网…...

[图解]SysML和EA建模住宅安全系统-14-黑盒系统规约

1 00:00:02,320 --> 00:00:07,610 接下来,我们看下一步指定黑盒系统需求 2 00:00:08,790 --> 00:00:10,490 就是说,把这个系统 3 00:00:11,880 --> 00:00:15,810 我们的目标系统,ESS,看成黑盒 4 00:00:18,030 --> …...

frp内网穿透xtcp安全点对点p2p部署记录打洞失败解决方法

环境 一、有公网IP、nas主机(需要穿透里面的服务)、安卓手机、frps-0.58.1、frpc-0.59.0(群晖NAS套件)、安卓版frpc-0.56.0 二、两端frpc必须要有一端nat网络类型不是非对称nat 开始 有公网的主机上配置frps.toml bindPort 7000nas主机端frpc.toml配…...

C++基础篇(2)

目录 前言 1.缺省参数 2.函数重载 2.1函数重载的基本规则 ​编辑2.2注意事项 2.3 重载解析(Overload Resolution)--补充内容 3.引用 3.1引用的概念和定义 3.2引用的特性 3.3引用的使用 3.4const引用 4.指针和引用的关系 结束语 前言 上节小编…...

c++ primer plus 第16章string 类和标准模板库,16.1.3 使用字符串

c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串 c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串 文章目录 c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串16.1.3 使用字符串程序清单16.3 hangman.cpp 16.1.3 使用字符串 现在&a…...

使用mybatis的statementHander拦截器监控表和字段并发送钉钉消息

新建mybatis的statementHander拦截器拦截器 类 面试题&#xff1a; 2.实现 解析Sql时引入JSqlParser JSqlParser 是一个 SQL 语句解析器。 它将 SQL转换为可遍历的 Java 类层次结构。 <dependency><groupId>com.github.jsqlparser</groupId><artifac…...

信贷系统——基础信贷概念

摘要 信贷是金融领域中的一个重要概念,指的是金融机构(如银行、信用合作社等)向个人、企业或政府提供资金的过程。在信贷过程中,金融机构向借款人提供资金,借款人则承诺在未来的某个时间点按照约定的条件和利率偿还借款。这种借款通常是在合同中明确约定的,包括贷款金额、…...

分页查询及其拓展应用案例

分页查询 分页查询是处理大量数据时常用的技术&#xff0c;通过分页可以将数据分成多个小部分&#xff0c;方便用户逐页查看。SQLAlchemy 提供了简单易用的方法来实现分页查询。 本篇我们也会在最终实现这样的分页效果&#xff1a; 1. 什么是分页查询 分页查询是将查询结果按照…...

【UE5.1】NPC人工智能——02 NPC移动到指定位置

效果 步骤 1. 新建一个蓝图&#xff0c;父类选择“AI控制器” 这里命名为“BP_NPC_AIController”&#xff0c;表示专门用于控制NPC的AI控制器 2. 找到我们之前创建的所有NPC的父类“BP_NPC” 打开“BP_NPC”&#xff0c;在类默认值中&#xff0c;将“AI控制器类”一项设置为“…...

有关电力电子技术的一些相关仿真和分析:⑤交-直-交全桥逆变+全波整流结构电路(MATLAB/Siumlink仿真)

全桥逆变+全波整流结构 参数:Vin=500V, Vo=200V, T=2:1:1, RL=10Ω, fs=100kHz, L=1mH, C=100uF (1)给定输入电压,输出电压和主电路参数,仿真研究电路工作原理,分析工作时序; (2)调节负载电阻,实现电流连续和断续,并仿真验证; (3)调节占空比,分析占空比与电…...

记录一次Android推流、录像踩坑过程

背景&#xff1a; 按照需求&#xff0c;需要支持APP在手机息屏时进行推流、录像。 技术要点&#xff1a; 1、手机在息屏时能够打开camera获取预览数据 2、获取预览数据时进行编码以及合成视频 一、息屏时获取camera预览数据&#xff1a; ①Camera.setPreviewDisplay(SurfaceH…...

VsCode 与远程服务器 ssh免密登录

首先配置信息 加入下列信息 Host qb-zn HostName 8.1xxx.2xx.3xx User root ForwardAgent yes Port 22 IdentityFile ~/.ssh/id_rsa 找到自己的公钥&#xff0c;不带pub是私钥&#xff0c;打死都不能给别人。复制公钥 拿到公钥后&#xff0c;来到远程服务器 vim ~/.ss…...

7/13 - 7/15

vo.setId(rs.getLong("id"))什么意思&#xff1f; vo.setId(rs.getLong("id")); 这行代码是在Java中使用ResultSet对象&#xff08;通常用于从数据库中检索数据&#xff09;获取一个名为"id"的列&#xff0c;并将其作为long类型设置为一个对象…...

烟雾监测与太阳能源:实验装置在其中的作用

太阳光在烟雾中的散射效应研究实验装置是一款模拟阳光透过烟雾环境的设备。此装置能帮助探究阳光在烟雾中的传播特性、散射特性及其对阳光的影响。 该装置主要包括光源单元、烟雾发生装置、光学组件、以及系统。光源单元负责产生类似于太阳光的光线&#xff0c;通常选用高亮度的…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...