Innodb索引页文件结构

Innodb索引页文件结构

首先Mysql的基本存储结构是页,Mysql中的存取数据是按照页进行存取的,在查找数据的时候是需要先定位到记录所在页,再从所在页中查找到相应的记录

数据页以一个双向链表维持着顺序,每个数据页以单向链表的格式对记录RowId进行逻辑排序,并且每个数据页之间的记录进行物理排序

存储结构
存储结构

由7部分组成

  • File Header 文件头,大小固定,为38字节
  • Page Header 页头,大小固定,为56字节
  • Infimum 和 Supremum Record
  • User Records 用户记录
  • Free Space 空闲空间
  • Page Directory 页目录
  • File Trailer 文件结尾信息,大小固定,为8字节

结构说明

File Header文件头

记录页的头信息,大小固定,为38字节,由8部分组成

  • FIL_PAGE_SPACE_OR_CHKSUM:4个字节32位checksum保存在header中。
  • FIL_PAGE_OFFSET:4个字节,表空间中页的偏移量,Page Number,page初始化时就被保存在header中。
  • FIL_PAGE_PREV:4个字节,当前页的上一页,B+Tree特性双向链表
  • FIL_PAGE_NEXT:当前页的下一页,B+Tree特性双向链表
  • FIL_PAGE_TYPE:2个字节,保存在header中,为了解析page数据,这个字段是必须的,Innodb存储引擎页的类型
    • FIL_PAGE_INDEX 十六进制表示为0x45BF,表示为B+树叶节点
    • FIL_PAGE_UNDO_LOG 十六进制表示为0x0002,表示为Undo log页
    • FIL_PAGE_INODE 十六进制表示为0x0003,表示为索引节点
    • FIL_PAGE_IBUF_FREE_LIST 十六进制表示为0x0004,表示为Insert buffer空闲列表
    • FIL_PAGE_TYPE_ALLOCATTED 十六进制表示为0x0000,表示为最新分配
    • FIL_PAGE_IBUF_BITMAP 十六进制表示为0x0005,表示为Insert buffer位图
    • FIL_PAGE_TYPE_SYS 十六进制表示为0x0006,表示为系统页
    • FIL_PAGE_TYPE_TRX_SYS 十六进制表示为0x0007,表示为事务系统数据
    • FIL_PAGE_TYPE_FSP_HDR 十六进制表示为0x0008,表示为File Space Header
    • FIL_PAGE_TYPE_XDES 十六进制表示为0x0009,表示为扩展描述页
    • FIL_PAGE_TYPE_BLOB 十六进制表示为0x000A,表示为BLOB页
  • FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID:4个字节,保存在header中,space的32位整型唯一编号,代表了该页属于哪个表空间。
  • FIL_PAGE_FILE_FLUSH_LSN:8个字节,仅在系统表空间中定义,代表文件至少被更新到了该LSN值,对于独立表空间,该值都为0
  • FIL_PAGE_LSN:8个字节,代表该页最后被修改的日志序列位置log sequence number。
Page Header页头

记录数据页的状态信息,大小固定,为56字节,由14部分组成

  • PAGE_N_DIR_SLOTS:2个字节,在Page Directory中的slot数
  • PAGE_HEAP_TOP:2个字节,堆中第一个记录的指针,记录在页中是根据堆的形式存放的
  • PAGE_N_HEAP:2个字节,堆中的记录数,第15位表示行记录格式
  • PAGE_FREE:2个字节,指向可重用空间的首指针
  • PAGE_GARBAGE:2个字节,已删除记录的字节数,即行记录结构中delete flag为1的记录大小的总数
  • PAGE_LAST_INSERT:2个字节,最后插入记录的位置
  • PAGE_DIRECTION:2个字节,最后插入的方向
  • PAGE_N_DIRECTION:2个字节,一个方向连续插入记录的数量
  • PAGE_N_RECS:2个字节,该页中记录的数量
  • PAGE_MAX_TRX_ID:8个字节,修改当前页的最大事务ID
  • PAGE_LEVEL:2个字节,当前页在索引树中的位置,0x00表示叶节点,即叶节点总是在第一层
  • PAGE_INDEX_ID:8个字节,表示当前页属于哪个索引
  • PAGE_BTR_SEG_LEAF:10个字节,B+树数据页非叶结点所在段的segment header
  • PAGE_BTR_SEGTOP:10个字节,B+树数据页所在段的segment header
Infimum 和 Supremum Record

Innodb中,每个数据页中有两个虚拟的行记录,用来限定记录的边界,Infimum记录是比该页中任何主键值都小的值,Supremum指比任何可能大的值还要大的值,这两个值在页创建的时候被创建

User Records

用户记录是实际存储行记录的内容

Free Space

指的是空闲空间,在一条记录被删除后,该空间会被加入到空闲链表中

Page Directory

页目录中存放了记录的相对位置

File Trailer

为了检测页是否已经完整的写入磁盘,其只有FIL_PAGE_END_LSN部分,占了8个字节,前四个字节代表该页的checksum值,后4个字节和File Header中的FIL_PAGE_LSN相同,通过与File Header中的cheacksum和FIL_PAGE_LSN的值进行比较,来保证页的完整性

拆页

每个数据页之间的记录都是按照RowId物理排序的,如果向一个已满的数据页插入数据就会导致拆页,创建一个新的数据页,将部分数据存放到新的数据页中(所以一般id都使用自增的,就是为了避免频繁的拆页,减少不必要的IO操作)

https://zhhll.icu/2021/数据库/关系型数据库/MySQL/进阶/23.Innodb索引页文件结构/

本文由 mdnice 多平台发布

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

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

相关文章

nvm安装node后,npm无效

类似报这种问题,是因为去github下载npm时下载失败, Please visit https://github.com/npm/cli/releases/tag/v6.14.17 to download npm. 第一种方法:需要复制这里面的地址爬梯子去下载(github有时不用梯子能直接下载,有…

CodeFuse-VLM 开源,支持多模态多任务预训练/微调

CodeFuse-MFT-VLM 项目地址:https://github.com/codefuse-ai/CodeFuse-MFT-VLM CodeFuse-VLM-14B 模型地址:CodeFuse-VLM-14B CodeFuse-VLM框架简介 随着huggingface开源社区的不断更新,会有更多的vision encoder 和 LLM 底座发布&#x…

力扣● 62.不同路径 ● 63. 不同路径 II

● 62.不同路径 单解这道题的话,发现第一行或者第一列的这些位置,都只有一条路径走到,所以路径条数都是1。这就是初始化。坐标大于第一行第一列的这些位置,因为机器人只能向下/向右走,所以只能从上个位置向下走和从左…

CentOS基于volatility2的内存取证实验

CentOS,Redhat和Fedora 都是Red Hat体系,采用yum管理器,不同于Debian、Ubuntu作为Debian体系使用apt 本文以CentOS为例,采用avml制作内存镜像,并利用volatility官方所给工具制作profile符号文件,进行简单的…

对象存储minio

参考Linux搭建免费开源对象存储 wget https://dl.minio.io/server/minio/release/linux-amd64/minio yum install -y wget yum install -y wget wget https://dl.minio.io/server/minio/release/linux-amd64/minio chmod x minio sudo mv minio /usr/local/bin/ minio --vers…

第7节、双电机直线运动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】,查看本系列全部文章 摘要:前面章节主要介绍单个电机控制,本节内容介绍两个电机完成Bresenham直线运动 一、Bresenham直线算法介绍 Bresenham直线算法由Jack Elton Bresenham于1962年在IBM开发,最初用于计…

小白水平理解面试经典题目LeetCode 20. Valid Parentheses【栈】

20.有效括号 小白渣翻译 给定一个仅包含字符 ‘(’ 、 ‘)’ 、 ‘{’ 、 ‘}’ 、 ‘[’ 和 ‘]’ ,判断输入字符串是否有效。 输入字符串在以下情况下有效: 左括号必须由相同类型的括号封闭。 左括号必须按正确的顺序关闭。 每个右括号都有一个对…

openstack(T版)公有云--Dashboard服务

公有云上OpenStack Train最小化安装_openstack最小化部署-CSDN博客 我的opensatck(T)是参考上面链接去部署完成的,在部署完Dashboard服务后,将要用浏览器访问的时候出现了404 500 Internal Server Error 等各种各样的问题,以下是我排查问题…

代码随想录算法训练营第二七天 | 回溯 组合 分割

目录 组合总和组合总和II分割回文串 LeetCode 39. 组合总和 LeetCode 40.组合总和II LeetCode 131.分割回文串 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &am…

嵌入式软件的设计模式与方法

思想有多远,我们就能走多远 4、状态与工作流类设计模式 4.1 状态与事件 行为随条件变化而改变,这里状态切换的模式也称为状态机。有限状态机 (Finite State Machine,FSM) 是由3 个主要元素组成的有向图: 状态、转换和动作。 状态是系统或者…

12. UE5 RPG使用GameplayEffect修改角色属性(三)

书接 11. UE5 RPG使用GameplayEffect修改角色属性(二) 前面,介绍了GameplayEffect的Instant和Duration的使用,这一篇主要介绍一下无限制时间类型的infinite的使用方式。 无限时间限制模式下,如果你的周期时间&#xff…

Android meminfo 查看方法及解析

目录 Android 上查看memory 信息的方法 内存限制的信息 手动释放缓存 例 adb shell dumpsys meminfo pid 解析 adb shell dumpsys meminfo 汇总信息说明 Total RAM Free RAM ION Used RAM Lost RAM ZRAM /proc/meminfo 参考文档 Android 上查看memory 信息的方法 …

vscode配置wsl ubuntu c++的环境

在ubuntu安装llvm/clang sudo apt install llvm clang clangd lldb vscode的调试器接口是按GDB开发的,所以需要一个适配器,lldb-mi就是这个适配器。lldb-mi原来是llvm项目的一部分,后面成为了一个单独的项目https://github.com/lldb-tools/…

【Docker】.NET Core 6.0 webapi 发布上传到Docker Desktop并启动运行访问,接口返回数据乱码解决方法

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Docker容器》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对…

C语言——联合体类型

📝前言: 在前面两篇文章:C语言——结构体类型(一)和C语言——结构体(二)中,我们讲述了C语言中重要的数据类型之一:结构体类型,今天我们来介绍一下C语言中的另…

C语言数组元素的引用

存储模式:一片连续的内存,按数据类型分割成若干相同大小的格子元素下标:数组开头位置的偏移量,a[0]引用第1个格子,a[1]引用第2个格子,以此类推 int a[5]; // 有效的下标范围是 0 ~ 4 a[0] 1; a[1] 2; a[2…

【机器学习】科学库使用手册第2篇:机器学习任务和工作流程(已分享,附代码)

本系列文章md笔记(已分享)主要讨论人工智能相关知识。主要内容包括,了解机器学习定义以及应用场景,掌握机器学习基础环境的安装和使用,掌握利用常用的科学计算库对数据进行展示、分析,学会使用jupyter note…

linux 自动定时清理缓存

文章目录 1,查看内存占用情况:1.1、free和available的区别?1.2、交换分区的作用? 2,手动清理命令3,定时自动清理3.1,创建文件夹3.2,新建文件cleanBuffer.sh3.3,添加内容3…

Transformer实战-系列教程2:Transformer算法解读2

🚩🚩🚩Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 Transformer实战-系列教程1:Transformer算法解读1 Transformer实战-系列教程2:Transformer算法解读2 5、Multi-head机制 在4中我们的输入是X&#x…

【保姆级教程|YOLOv8改进】【5】精度与速度双提升,使用FasterNet替换主干网络

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…