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 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之RichText组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之RichText组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、RichText组件 鸿蒙(HarmonyOS)富文本组件,…

CentOS基于volatility2的内存取证实验

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

synchronized内部工作原理

作者简介: zoro-1,目前大二,正在学习Java,数据结构,javaee等 作者主页: zoro-1的主页 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 synchronized内部工作原理 syn…

kafka-splunk数据通路实践

目的: 鉴于目前网络上没有完整的kafka数据投递至splunk教程,通过本文操作步骤,您将实现kafka数据投递至splunk日志系统 实现思路: 创建kafka集群部署splunk,设置HTTP事件收集器部署connector服务创建connector任务&a…

前缀和算法

【模板】前缀和 题目链接:前缀和 算法思路 先预处理出来⼀个「前缀和」数组: ⽤ dp[i] 表⽰: [1, i] 区间内所有元素的和,那么 dp[i - 1] ⾥⾯存的就是 [1, i - 1] 区间内所有元素的和,那么:可得递推公式…

docker安装etherpad文档系统

效果 安装 1.创建并进入目录 mkdir -p /opt/etherpad cd /opt/etherpad 2.修改目录权限 chmod -R 777 /opt/etherpad 3.创建并启动容器 docker run -d --name etherpad --restart always -p 10054:9001 -v /opt/etherpad/data:/opt/etherpad-lite/var etherpad/etherpad:la…

YOLO-World——超级轻量级开放词汇目标检测方法

前言 目标检测一直是计算机视觉领域中不可忽视的基础挑战,对图像理解、机器人技术和自主驾驶等领域具有广泛应用。随着深度神经网络的发展,目标检测方面的研究取得了显著进展。尽管这些方法取得了成功,但它们存在一些限制,主要体…

业务架构设计之汽配供应链与实现的实践总结

随着汽车行业的不断发展,汽配供应链的规模和复杂度也在不断增加。为了满足市场需求,建立一个高效、可靠的汽配供应链业务系统至关重要。本文将总结一些关键的实践经验,帮助读者了解如何设计和实现一个稳定且高效的汽配供应链业务系统。 1. 业…

从零开始手写mmo游戏从框架到爆炸(七)— 消息封装

上一篇,我们初步把消息handler 注册到了服务中,在进行后续工作之前我们需要再做一些准备工作。 第一:把之前自己管理的bean放到spring中去管理,后面大部分的bean都通过spring来管理。 第二:为了方便路由消费&#xff0…

C语言:内存函数

创作不易,友友们给个三连吧!! C语言标准库中有这样一些内存函数,让我们一起学习吧!! 一、memcpy函数的使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); 1.1 使…

分享65个节日PPT,总有一款适合您

分享65个节日PPT,总有一款适合您 65个节日PPT下载链接:https://pan.baidu.com/s/1hc1M5gfYK8eDxQVsK8O9xQ?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易。知…

编译原理与技术(二)——词法分析(一)正则表达式

一、词法分析的概貌 一个程序,在我们看来往往是像下图这样的。 实际上,上面的程序本质上就是一个字符串,所以,它等价于下面这样的。 上面的字符串(字符流) ,就是编译器接收到的程序的形式。 所…

centos安装inpanel

前置条件 安装python yum -y install python 安装 cd /usr/local git clone https://gitee.com/WangZhe168_admin/inpanel.git cd inpanel python install.py 安装过程需要设置账户 密码 端口号 我设置的是admin:admin 10050 使用 打开浏览器,输入 http://192.168.168.…

【人工智能】神奇的Embedding:文本变向量,大语言模型智慧密码解析(10)

什么是嵌入? OpenAI 的文本嵌入衡量文本字符串的相关性。嵌入通常用于: Search 搜索(结果按与查询字符串的相关性排序)Clustering 聚类(文本字符串按相似性分组)Recommendations 推荐(推荐具有…

02.05

1.单链表 main #include "1list_head.h" int main(int argc, const char *argv[]) { //创建链表之前链表为空Linklist headNULL;int n;datatype element;printf("please enter n:");scanf("%d",&n);for(int i0;i<n;i){printf("ple…

22.仿简道云公式函数实战-数学函数-COT

1. COT函数 COT 函数可用于计算角度的余切值。 2. 函数用法 COT(弧度) 使用该函数时&#xff0c;需要将角度转化为弧度参与计算&#xff0c;可通过 RADIANS 函数 将角度转化为弧度。 3. 函数示例 如计算 COT(45) 的值&#xff0c;可设置公式为COT(RADIANS(45))&#xff0…

算法——二分查找算法

1. 二分算法是什么&#xff1f; 简单来说&#xff0c;"二分"指的是将查找的区间一分为二&#xff0c;通过比较目标值与中间元素的大小关系&#xff0c;确定目标值可能在哪一半区间内&#xff0c;从而缩小查找范围。这个过程不断重复&#xff0c;每次都将当前区间二分…

算法练习-四数之和(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;数组 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0c;旨在…

配置git环境与项目创建

项目设计 名称&#xff1a;KOB 项目包含的模块 PK模块&#xff1a;匹配界面&#xff08;微服务&#xff09;、实况直播界面&#xff08;WebSocket协议&#xff09; 对局列表模块&#xff1a;对局列表界面、对局录像界面 排行榜模块&#xff1a;Bot排行榜界面 用户中心模块&…

【Qt】常见问题

1.存在未解析的标识符 将build文件夹删掉重新编译。 2.左侧项目目录栏无法删除已添加项目 打开目标项目上一级的pro文件&#xff0c;将目标文件名字注释或者删除掉&#xff0c;最后保存&#xff0c;qt就会自动更新&#xff0c;将该项目隐藏掉。 3.在qt creator下添加槽函数…