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

【mysql体系结构】InnoDB索引页结构

【mysql体系结构】InnoDB索引页结构

页是InnoDB管理存储空间的基本单元,一个页的大小一般是16KB。
在这里插入图片描述

名称中⽂名占⽤空间⼤⼩简单描述
File Header⽂件头部38字节⻚的⼀些通⽤信息
Page Header⻚⾯头部56字节数据⻚专有的⼀些信息
Infimum + Supremum最⼩记录和最⼤记录26字节两个虚拟的⾏记录
User Records⽤户记录不确定实际存储的⾏记录内容
Free Space空闲空间不确定⻚中尚未使⽤的空间
Page Directory⻚⾯⽬录不确定⻚中的某些记录的相对位置
File Trailer⽂件尾部8字节校验⻚是否完整

File Header

File Header针对各种类型 的⻚都通⽤,也就是说不同类型的⻚都会以File Header作为第⼀个组成部分。这个部分占⽤固定的38个字节。是由下边这些内容组成的:

名称占⽤空间⼤⼩描述
FIL_PAGE_SPACE_OR_CHKSUM4字节⻚的校验和(checksum值)
FIL_PAGE_OFFSET4字节⻚号
FIL_PAGE_PREV4字节上⼀个⻚的⻚号
FIL_PAGE_NEXT4字节下⼀个⻚的⻚号
FIL_PAGE_LSN8字节⻚⾯被最后修改时对应的⽇志序列位置(英⽂名 是:Log Sequence Number)
FIL_PAGE_TYPE2字节该⻚的类型
FIL_PAGE_FILE_FLUSH_LSN8字节仅在系统表空间的⼀个⻚中定义,代表⽂件⾄少 被刷新到了对应的LSN值
FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID4字节⻚属于哪个表空间
  • FIL_PAGE_SPACE_OR_CHKSUM

这个代表当前⻚⾯的校验和(checksum)。就是对于⼀个很⻓很⻓的字节串来说,我们会通过某种算法来计算⼀个⽐较短的值来代表这个很 ⻓的字节串,这个⽐较短的值就称为校验和。这样在⽐较两个很⻓的字节串之前先⽐较这两个⻓字节串的校验和,如果校验和都不⼀样两个⻓字节串肯定是不 同的,所以省去了直接⽐较两个⽐较⻓的字节串的时间损耗。

  • FIL_PAGE_OFFSET

每⼀个⻚都有⼀个单独的⻚号,InnoDB通过⻚号来可以唯⼀定位⼀个⻚。

  • FIL_PAGE_TYPE

代表页的类型与值的对应关系:

类型名称⼗六进制描述
FIL_PAGE_TYPE_ALLOCATED0x0000最新分配,还没使⽤
FIL_PAGE_UNDO_LOG0x0002Undo⽇志⻚
FIL_PAGE_INODE0x0003段信息节点
FIL_PAGE_IBUF_FREE_LIST0x0004Insert Buffer空闲列表
FIL_PAGE_IBUF_BITMAP0x0005Insert Buffer位图
FIL_PAGE_TYPE_SYS0x0006系统⻚
FIL_PAGE_TYPE_TRX_SYS0x0007事务系统数据
FIL_PAGE_TYPE_FSP_HDR0x0008表空间头部信息
FIL_PAGE_TYPE_XDES0x0009扩展描述⻚
FIL_PAGE_TYPE_BLOB0x000ABLOB⻚
FIL_PAGE_INDEX0x45BF索引⻚,也就是我们所说的数据⻚

Page Header(页面头部)

Page Header的部分,它是⻚结构的第⼆部分,这个部分占⽤固定的56个字节,专⻔存储各种状态信息。

名称占⽤空间⼤⼩描述
PAGE_N_DIR_SLOTS2字节在⻚⽬录中的槽数量
PAGE_HEAP_TOP2字节还未使⽤的空间最⼩地址,也就是说从该地址之 后就是Free Space
PAGE_N_HEAP2字节本⻚中的记录的数量(包括最⼩和最⼤记录以及标记为删除的记录)
PAGE_FREE2字节第⼀个已经标记为删除的记录地址(各个已删除 的记录通过next_record也会组成⼀个单链表, 这个单链表中的记录可以被重新利⽤)
PAGE_GARBAGE2字节已删除记录占⽤的字节数
PAGE_LAST_INSERT2字节最后插⼊记录的位置
PAGE_DIRECTION2字节记录插⼊的⽅向
PAGE_N_DIRECTION2字节⼀个⽅向连续插⼊的记录数量
PAGE_N_RECS2字节该⻚中记录的数量(不包括最⼩和最⼤记录以及 被标记为删除的记录)
PAGE_MAX_TRX_ID8字节修改当前⻚的最⼤事务ID,该值仅在⼆级索引中定义
PAGE_LEVEL2字节当前⻚在B+树中所处的层级
PAGE_INDEX_ID8字节索引ID,表示当前⻚属于哪个索引
PAGE_BTR_SEG_LEAF10字节B+树叶⼦段的头部信息,仅在B+树的Root⻚定义
PAGE_BTR_SEG_TOP10字节B+树⾮叶⼦段的头部信息,仅在B+树的Root⻚定义
  • PAGE_DIRECTION

假如新插⼊的⼀条记录的主键值⽐上⼀条记录的主键值⼤,我们说这条记录的插⼊⽅向是右边,反之则是左边。⽤来表示最后⼀条记录插⼊⽅向的状态就是PAGE_DIRECTION。

  • PAGE_N_DIRECTION

假设连续⼏次插⼊新记录的⽅向都是⼀致的,InnoDB会把沿着同⼀个⽅向插⼊记录的条数记下来,这个条数就⽤PAGE_N_DIRECTION这个状态表示。当然,如果最后⼀条记录的插⼊⽅向改变了的话,这个状态的值会被清零重新统计。

Page Directory页目录

对于最⼩记录所在的分组只能有1条记录,最⼤记录所在的分组拥有的记录条数只能在1-8条

之间,剩下的分组中记录的条数范围只能在是4-8条之间。

在⼀个数据⻚中查找指定主键值的记录的过程分为两步:

1、通过⼆分法确定该记录所在的槽,并找到该槽中主键值最⼩的那条记录。

2、通过记录的next_record属性遍历该槽所在的组中的各个记录。

File Trailer

File Trailer部分,这个部分由8个字节组成,可以分成2个⼩部分:

  • 前4个字节代表⻚的校验和

这个部分是和File Header中的校验和相对应的。每当⼀个⻚⾯在内存中修改了,在同步之前就要把它的校验和算出来,因为File Header在⻚⾯的前边,所 以校验和会被⾸先同步到磁盘,当完全写完时,校验和也会被写到⻚的尾部,如果完全同步成功,则⻚的⾸部和尾部的校验和应该是⼀致的。如果写了⼀半断电了,那么在File Header中的校验和就代表着已经修改过的⻚,⽽在File Trialer中的校验和代表着原先的⻚,⼆者不同则意味着同步中间出了错。

  • 后4个字节代表⻚⾯被最后修改时对应的⽇志序列位置(LSN)

相关文章:

  • Roson的Qt之旅 #123 QNetworkConfigurationManager网络配置管理
  • 【数据结构与算法】ArrayList的模拟实现
  • Spring5源码之IOC的Bean管理之xml
  • DHCP 服务
  • [架构之路-20]:目标系统 - 硬件平台 - 嵌入式系统硬件电路基础:架构、设计流程、总线、外设、基本电路、编码
  • 关系代数 运算
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • python使用cv2库实现图像的读取处理显示和保存
  • 二道题:分组顺序向下填充 和 标注数据整理
  • 节日网页HTML代码 学生网页课程设计期末作业下载 清明节大学生网页设计制作成品下载 DW节日网页作业代码下载
  • 生命在于折腾——某国外cms代码审计
  • 『从零开始学小程序』媒体组件audio组件
  • [HJ73 计算日期到天数转换]
  • FastDFS数据迁移
  • Java Web 10 JSP 10.3 JSP 原理
  • [case10]使用RSQL实现端到端的动态查询
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 03Go 类型总结
  • gulp 教程
  • Hexo+码云+git快速搭建免费的静态Blog
  • Java反射-动态类加载和重新加载
  • leetcode386. Lexicographical Numbers
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • React中的“虫洞”——Context
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Swoft 源码剖析 - 代码自动更新机制
  • Vue UI框架库开发介绍
  • vue-cli3搭建项目
  • 产品三维模型在线预览
  • 大数据与云计算学习:数据分析(二)
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 区块链共识机制优缺点对比都是什么
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • #NOIP 2014# day.1 T2 联合权值
  • #WEB前端(HTML属性)
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (4)(4.6) Triducer
  • (简单) HDU 2612 Find a way,BFS。
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (一)u-boot-nand.bin的下载
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .jks文件(JAVA KeyStore)
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET 指南:抽象化实现的基类
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .ui文件相关
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • :如何用SQL脚本保存存储过程返回的结果集
  • @31省区市高考时间表来了,祝考试成功
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)