mysql之Innodb数据页

Innodb数据页结构

      • InnoDB数据页结构
        • 一、数据页基础概念
        • 二、数据页核心结构
          • 1. 头部控制区
          • 2. 数据存储区
          • 3. 尾部与目录区
        • 三、关键机制详解
          • 1. 记录链表与删除优化
          • 2. 页目录与二分查找
          • 3. 空间复用与碎片管理
          • 4. 数据页的合并与分裂
        • 四、应用与性能影响
          • 1. 索引效率
          • 2. 插入优化
          • 3. 事务与恢复
          • 4. 与 Buffer Pool 的关系
        • 五、总结

InnoDB数据页结构

innodb数据页

一、数据页基础概念
  • 页大小:InnoDB默认页大小为16KB,是存储管理的基本单位。

  • 页类型:包含索引页(数据页)、Undo页、系统页、Inode页、IBuf页等,本文聚焦 索引页(数据页) ,用于存储表记录。

    • FIL_PAGE_UNDO_LOG: Undo Log 页,用于存储事务回滚所需的信息。

    • FIL_PAGE_INODE: Inode 页,用于存储段(Segment)的元数据信息。

    • FIL_PAGE_IBUF: Insert Buffer 页,用于缓存对二级索引的插入操作。

    • FIL_PAGE_TYPE_ALLOCATED: 新分配但未使用的页。


二、数据页核心结构

数据页由7部分组成,按功能分为三大部分:

1. 头部控制区
  • File Header(38字节)
  • 功能:跨页管理,包含页号(FIL_PAGE_OFFSET)、前后页指针(FIL_PAGE_PREV/NEXT)、页类型(FIL_PAGE_INDEX表示数据页)、LSN(FIL_PAGE_FILE_FLUSH_LSN)和校验和(FIL_PAGE_SPACE_OR_CHKSUM)。

  • 字段详解:

  • FIL_PAGE_OFFSET: 页号,唯一标识一个页。

  • FIL_PAGE_PREV/NEXT: 前后页指针,形成双向链表,用于B+树的范围查询。

  • FIL_PAGE_TYPE: 页类型,标识页的用途。

  • FIL_PAGE_FILE_FLUSH_LSN: 页面最后一次刷新到磁盘时的LSN。

  • FIL_PAGE_SPACE_OR_CHKSUM: 页的校验和,使用CRC32算法计算,用于检测页的完整性。

  • 应用:通过双向链表连接相邻页,支持B+树索引结构;校验和用于检测页完整性。

  • Page Header(56字节)
  • 功能:记录页内状态,如记录数(PAGE_N_RECS)、空闲位置(PAGE_HEAP_TOP)、删除记录链表(PAGE_FREE)、索引层级(PAGE_LEVEL)、插入方向(PAGE_DIRECTION)、连续插入次数(PAGE_N_DIRECTION)和最后插入位置(PAGE_LAST_INSERT)。

  • 字段详解:

  • PAGE_N_RECS: 页中记录的数量(不包括Infimum和Supremum)。

  • PAGE_HEAP_TOP: 指向堆中第一个可用空间的指针,也是新纪录插入位置的起点。

  • PAGE_FREE: 指向已删除记录组成的垃圾链表的头部。

  • PAGE_LEVEL: 当前页在B+树中的层级,0表示叶子节点。

  • PAGE_DIRECTION: 最近插入记录的方向(左/右)。

  • PAGE_N_DIRECTION: 最近连续往相同方向插入记录的次数。

  • PAGE_LAST_INSERT: 指向最后插入的记录。

  • 应用:快速获取页填充状态,指导插入和空间重用,优化页分裂策略。

2. 数据存储区
  • User Records & Free Space
  • 动态分配:记录按行格式存储,新增记录从Free Space划分空间,用尽后申请新页。

  • 行格式细节:InnoDB支持多种行格式 (ROW_FORMAT),包括 CompactRedundantDynamicCompressedCompact 是最常用的行格式,它具有更高的存储效率。

  • Compact 行格式结构:

  1. Record Header (5 字节): 存储记录的元数据信息。

  2. 变长字段长度列表: 逆序存储变长字段的实际长度,每个长度占用1字节或2字节。

  3. NULL值标志位: 如果记录中存在NULL值,则使用该标志位标识哪些字段为NULL。

  4. 实际数据: 存储记录的实际数据。

  • Record Header 详解:

  • delete_mask (1 bit): 标记记录是否被删除。

  • record_type (3 bits): 记录类型,0表示普通记录,1表示B+树非叶子节点记录,2表示Infimum记录,3表示Supremum记录。

  • next_record (16 bits): 指向下一条记录的偏移量,形成单向链表。

  • heap_no (13 bits): 记录在堆中的位置编号。

  • n_owned (4 bits): 页目录槽拥有的记录数。

  • min_rec_mask (1 bit): B+树的每个非叶子节点都必须包含两条记录,分别是最小记录和最大记录。通过设置min_rec_mask标记,保证非叶子节点中最小记录的min_rec_mask值为1。

  • Dynamic/Compressed 行格式: 当记录中的某些列(如TEXT或BLOB类型)的内容过大时,会使用 DynamicCompressed 行格式,将这些列的数据存储在单独的溢出页中。 Compressed 行格式还会对数据进行压缩。

  • 删除处理delete_mask标记删除记录加入垃圾链表(PAGE_FREE指向),空间可重用,减少碎片。 实际上被删除的记录仍然保存在页中,只是通过 delete_mask 标记为已删除,并且链入到垃圾链表中。 当有新的记录需要插入时,会优先使用这些被删除记录的空间。 PAGE_GARBAGE 统计已删除空间总量,辅助空间分配决策。

  • Free Space 管理: InnoDB 使用链表或者位图来管理 Free Space。 当需要分配空间时,会从 Free Space 链表中找到合适的空闲块进行分配。

  • Infimum + Supremum(26字节)
  • 虚拟记录:作为逻辑边界,Infimum为最小记录,Supremum为最大记录,初始化时即存在。

  • 作用:简化范围查询,维护记录链表的起点和终点。

3. 尾部与目录区
  • Page Directory(页目录)
  • 槽(Slot)结构:将记录分组,每组最后一条记录(槽)保存地址偏移量,槽按主键排序。 每个槽指向组内最大记录的地址偏移量,通过这个偏移量可以找到组内的记录。

  • 分组规则:初始组(Infimum)1条,最大记录组1-8条,其他组4-8条。插入触发动态分裂。

  • n_owned: 每个槽拥有 n_owned 个记录,这个值表示该槽指向的记录是其所在组的最后一条记录,且该槽拥有该组内的所有记录。 当插入一条新记录时,会找到与该记录主键值最接近的槽,然后将该槽的 n_owned 值加1。 如果 n_owned 值超过8,则会触发槽的分裂。

  • 二分查找:通过槽快速定位记录,时间复杂度从O(n)降至O(log n)。

  • 查找流程

  1. 二分法确定目标槽。

  2. 遍历槽内记录(组内最多8条),避免全页扫描。

  • File Trailer(8字节)
  • 校验机制:包含页尾校验和与LSN(日志序列号),与File Header校验和对比,确保页写入完整性。

  • LSN (Log Sequence Number): LSN 是一个单调递增的数值,用于表示事务日志的写入顺序。 File Trailer 中存储的 LSN 表示该页最后一次被修改时的 LSN。 LSN 不仅用于崩溃恢复,还用于支持 MVCC (Multi-Version Concurrency Control)。

  • 页尾校验和与页头的校验和用于确保数据页在写入磁盘时没有发生损坏。


三、关键机制详解
1. 记录链表与删除优化
  • 单链表结构:记录按主键排序,通过next_record串联,支持高效顺序访问。

  • 删除优化delete_mask标记删除,空间暂不释放,链入垃圾链表供后续重用,避免频繁整理。 当有新记录插入时,优先使用垃圾链表中的空间。

2. 页目录与二分查找
  • 槽管理

    • 每个槽指向组内最大记录,初始槽数为2(Infimum和Supremum)。

    • 插入记录时,定位到差值最小的槽,增加n_owned值,超过阈值则分裂组。 槽实际上存储的是组内最大的记录的地址偏移量,通过这个偏移量可以找到组内的记录。

  • 查找流程

    • 二分法确定目标槽。

    • 遍历槽内记录(组内最多8条),避免全页扫描。

3. 空间复用与碎片管理
  • Free Space重用:删除记录的空间优先分配给新插入,减少空间扩张。 InnoDB 使用链表或者位图来管理 Free Space。

  • PAGE_GARBAGE统计:跟踪已删除空间总量,辅助空间分配决策。

4. 数据页的合并与分裂
  • 页分裂: 当一个数据页的空间被用完,需要插入新的记录时,就会发生页分裂。 页分裂会将当前页的数据复制到新的页中,并将当前页分成两个部分,分别指向新的页。

  • 页合并: 当一个数据页中的数据被删除到一定程度,导致空间利用率过低时,就会发生页合并。 页合并会将相邻的两个页合并成一个页,从而提高空间利用率。


四、应用与性能影响
1. 索引效率
  • B+树结构:数据页作为叶子节点,通过File Header中的前后页指针形成双向链表,支持范围查询。

  • 非叶子节点: B+树的非叶子节点存储的是索引键值和指向子节点的指针。 非叶子节点用于快速定位到叶子节点。

  • 页目录加速:槽的二分查找大幅减少索引定位时间,尤其适合大范围扫描。

2. 插入优化
  • 顺序插入:通过PAGE_DIRECTIONPAGE_N_DIRECTION统计插入方向,优化页分裂策略。

  • 紧凑存储:变长字段逆序存储(如NULL值列表),提升缓存命中率。

  • innodb_fill_factor** 参数:** 这个参数影响数据页的填充程度,从而影响空间利用率和查询性能。 较高的填充因子可以提高空间利用率,但可能会导致更频繁的页分裂。

3. 事务与恢复
  • LSN机制:File Trailer中的LSN与日志系统协作,确保崩溃恢复时页状态的正确性。 LSN 也用于支持 MVCC。

  • Redo Log: Redo Log 记录了数据页的变更操作,用于在崩溃恢复时重做这些操作,保证数据的一致性。

  • Undo日志:虽未展开,但数据页与Undo页协作支持事务回滚和多版本控制(MVCC)。 Undo Log 记录了数据页的旧版本数据,用于支持事务回滚和 MVCC。

4. 与 Buffer Pool 的关系
  • Buffer Pool 是 InnoDB 存储引擎用于缓存数据页的内存区域。 当需要访问某个数据页时,会先从 Buffer Pool 中查找,如果找到则直接使用,否则需要从磁盘读取到 Buffer Pool 中。

  • Buffer Pool 的大小直接影响数据库的性能。 较大的 Buffer Pool 可以缓存更多的数据页,从而减少磁盘 I/O。


五、总结

InnoDB数据页通过精细的结构设计,实现了高效存储管理、快速数据访问和强一致性保障:

  • 存储管理:动态空间分配与碎片重用,平衡空间利用率与性能。

  • 查询优化:页目录和有序链表结构,支持高效点查与范围扫描。

  • 可靠性:校验和与LSN机制确保数据完整性,应对意外中断。

理解数据页结构对数据库调优(如合理选择行格式、监控页分裂、调整 innodb_fill_factor 参数)、故障排查(如空间碎片分析)和性能优化具有重要指导意义。

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

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

相关文章

1200沿指令和取反指令的应用。

以下是关于西门子S7-1200 PLC中沿指令(边沿检测指令)和取反指令的详细解析及应用示例,结合其工作原理、编程方法和典型场景: 一、沿指令(边沿检测指令) 1. 功能说明 沿指令用于检测信号状态的变化&#x…

three.js之特殊材质效果

*案例42 创建一个透明的立方体 <template><div ref"container" className"container"></div> </template><script setup> import * as THREE from three; import WebGL from three/examples/jsm/capabilities/WebGL.js // 引…

三格电子上新了——PLC 数据采集网关

型号&#xff1a;SG-PLC-Private 第一章 产品概述 PLC 转 Modbus 网关型号 SG-PLC-Private &#xff08; PLC 私有协议网关&#xff09;&#xff0c;是三格电子推出的工业 级网关&#xff08;以下简称网关&#xff09;&#xff0c;主要用于 在不需要对 PLC 编程的情况…

算法日记25:01背包(DFS->记忆化搜索->倒叙DP->顺序DP->空间优化)

对于01背包这类DP入门的问题&#xff0c;新手应该是去了解如何一步步得出所谓的状态转移方程&#xff0c;而不是直接去看答案所给予的方程过程应该为&#xff1a;DFS->记忆化搜索->倒序递推->循序递推->二维->一维 一、DFS暴力搜索 O ( 2 n ) O(2^n) O(2n) 1…

Spring AutoWired与Resource区别?

大家好&#xff0c;我是锋哥。今天分享关于【Spring AutoWired与Resource区别?】面试题。希望对大家有帮助&#xff1b; Spring AutoWired与Resource区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Spring 中&#xff0c;Autowired 和 Resource 都是用于…

【知识】深度学习中,应该先zero_grad还是先backward?

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 抛出问题 各大GPT的回答 ChatGPT-4o ChatGPT-o3-mini-high Kimi-长思考 Deepseek-R1 Grok3 Pytorch官方教程中 抛出问题 以下哪种方式是…

Python----数据结构(哈希表:哈希表组成,哈希冲突)

一、哈希表 哈希表(Hash table)是一种常用、重要、高效的数据结构。 哈希表通过哈希函数,可以快速地将键(Key)映射到值(Value)。从而允许在近常数时间内对键关联的值进行插入、删除和查找操作。 哈希表的主要思想是通过哈希函数将键转换为索引&#xff0c;将索引映射到数组中…

使用excel中的VBA合并多个excel文件

需求是这样的&#xff1a; 在Windows下&#xff0c;用excel文件让多个小组填写了统计信息&#xff0c;现在我需要把收集的多个文件汇总到一个文件中&#xff0c;前三行为标题可以忽略&#xff0c;第四行为收集信息的列名&#xff0c;处理每一行数据的时候&#xff0c;发现某一行…

功能全面的手机壁纸应用,种类齐全、众多高清壁纸

软件介绍 应用亮点&#xff1a;今天给大家分享一款超神奇的手机应用 —— 奇幻壁纸。它作为手机动态壁纸软件&#xff0c;功能超全面&#xff0c;操作还便捷&#xff0c;极具创意&#xff0c;能瞬间将你的手机屏幕变成奇幻世界&#xff0c;带来全新视觉感受。 使用便捷性&…

docker安装kafka,并通过springboot快速集成kafka

目录 一、docker安装和配置Kafka 1.拉取 Zookeeper 的 Docker 镜像 2.运行 Zookeeper 容器 3.拉取 Kafka 的 Docker 镜像 4.运行 Kafka 容器 5.下载 Kafdrop 6.运行 Kafdrop 7.如果docker pull wurstmeister/zookeeper或docker pull wurstmeister/kafka下载很慢&#x…

前端导出word文件,并包含导出Echarts图表等

基础导出模板 const html <html><head><style>body {font-family: Times New Roman;}h1 {text-align: center;}table {border-collapse: collapse;width: 100%;color: #1118FF;font-weight: 600;}th,td {border: 1px solid black;padding: 8px;text-align: …

2024系统编程语言风云变幻:Rust持续领跑,Zig与Ada异军突起

2024年系统编程语言调查报告新鲜出炉&#xff01;这份报告对Rust、Zig、Ada、C、C等主流语言进行了全面评估&#xff0c;结果令人瞩目。Rust凭借其强大的类型系统和内存安全机制继续领跑&#xff0c;而Zig和Ada则展现出巨大的潜力&#xff0c;为系统编程领域带来了新的活力。本…

Jenkins 构建 Unity 打包 .apk 同时生成 .aab

Jenkins 构建 Unity 打包 .apk 同时生成 .aab Android App Bundle简称 AAB&#xff0c;想了解更多关于 AAB 的知识&#xff0c;请看官网 https://developer.android.google.cn/guide/app-bundle/faq?hlzh-cn APK 打包部分在复用上一篇 Jenkins 构建 Unity打包APK 一、新建一…

JAVAweb-标签选择器,盒模型,定位,浮动

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>标签</title><style type"text/css&q…

计算机视觉:主流数据集整理

第一章&#xff1a;计算机视觉中图像的基础认知 第二章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(一) 第三章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(二) 第四章&#xff1a;搭建一个经典的LeNet5神经网络(附代码) 第五章&#xff1…

二级公共基础之数据结构与算法篇(五)树和二叉树

目录 前言 一、树的基本概念 1.父结点和根节点 2.子节点和叶子节点 3.度和深度 4.子树 二、二叉树及其基本性质 1. 二叉树的定义 2. 二叉树的基本性质 性质1 性质2 性质3 性质4 性质5 性质6 三、二叉树的存储结构 四、二叉树的遍历 1.遍历二叉树的概念 1. 前…

自制操作系统学习第七天

今天要做什么&#xff1f; 实现HLT&#xff0c;不让计算机处于HALT&#xff08;HLT&#xff09;.用C语言实现内存写入&#xff08;错误&#xff0c;需要分析&#xff09; 一:使用HLT&#xff0c;让计算机处于睡眠状态 写了下面这个程序&#xff0c;naskfunc.nas 函数名叫io_h…

Python Django系列—入门实例(二)

数据库配置 现在&#xff0c;打开 mysite/settings.py 。这是个包含了 Django 项目设置的 Python 模块。 默认情况下&#xff0c;​ DATABASES 配置使用 SQLite。如果你是数据库新手&#xff0c;或者只是想尝试 Django&#xff0c;这是最简单的选择。SQLite 包含在 Python 中…

DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署

DeepSeek接入Siri&#xff08;已升级支持苹果手表&#xff09;完整版硅基流动DeepSeek-R1部署 **DeepSeek** 是一款专注于深度学习和人工智能的工具或平台&#xff0c;通常与人工智能、机器学习、自动化分析等领域有关。它的主要功能可能包括&#xff1a;深度学习模型搜索&…

抗辐照加固CAN FD芯片的商业航天与车规级应用解析

在工业自动化、智能汽车、航空航天及国防装备等关键领域&#xff0c;数据传输的安全性、可靠性与极端环境适应能力是技术升级的核心挑战。国科安芯推出全新一代CANFD&#xff08;Controller Area Network Flexible Data Rate&#xff09;芯片&#xff0c;以高安全、高可靠、断电…