IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> innodb 存储引擎之:记录的数据结构,数据页的数据结构 -> 正文阅读

[数据结构与算法]innodb 存储引擎之:记录的数据结构,数据页的数据结构

目录

innodb 行格式

COMPACT 行格式

记录的额外信息

变长字段长度列表

NULL值列表

记录的头信息

记录的真实数据

innodb数据页结构示意图

File Header

Page Header(页头部)

lnfimum + Supremum

User Records

Free Space

Page Directory(页目录)

File Trailer

一个数据页的示意图


innodb 行格式

innodb 有4中不同类型的行格式,分别是

  • COMPACT
  • REDUNDANT
  • DYNAMI
  • COMPRESSED

创建表时,可以执行表的行格式, create table t (''''''') ROW_FORMAT = COMPACT

COMPACT 行格式

记录的额外信息

变长字段长度列表

所有变长字段的真实数据占用 字节数都存放在记录的开头位置,从而形成一个变长字段长度列表,各变长字段的真实数据占用的字节数按照列的顺序逆序存放(再次强调一遍,是逆序存放)

NULL值列表

一条记录中的某些列可能存储 NULL 值,所以把一条记录中值为 NULL 的列统一管理起来,存储到 “NULL 值列表”,如果表中没有允许存储 NULL 的列,则 NULL 值列表也就不存在了

记录的头信息

记录的头信息占用空间为 5 字节,也就是 40个二进制位

记录头信息中各二进制位代表的意思

重点需要知道,deleteed_flag,n_owned,record_type,next_record 各个字段的含义

记录的真实数据

记录的真实数据除了保存了,表的一条记录的各个列的数据外,MySQL 会为每个记录默认地添加一些列(也称为隐藏列),见下图

innodb数据页结构示意图

innodb 读取数据的方式是以“页”为单位,作为磁盘和内存之间交互的基本单位,innodb 默认的页大小为 16KB。

innodb_page_size 控制“页”的大小,在mysql运行的过程中是无法修改此配置的,也就是说该配置是不能动态修改的,如果要让修改后的值生效,只能重启。

各部分解释

在一开始生成页的时候,其实并没有 User Records 部分,每当插入一条记录时都会从 Free Space 部分(也就是尚未使用的存储空间〉申请一个记录大小的空间,并将这个空间划分到 User Records 部分。当 Free Space 部分的空间全部被 User Records 部分替代掉之后,也就意味着这个页使用完了,此时如果还有新的记录插入,就需要去申请新的页了 。这个过程如下图所示

File Header

占股东的38字节,各个字节的具体用途

重点需要知道 图中标黄的部分

Page Header(页头部)

固定占用56字节,各个字节的具体用途

重点需要知道图中标黄的部分

lnfimum + Supremum

两个虚拟的伪记录 ,分别表示页中的最小记录和最大记录,占固定的 26 字节

User Records

真正存储记录的地方,大小不固定

Free Space

页中尚未使用的部分,大小不固定

Page Directory(页目录)

大小不固定,插入的记录越多,“槽”就越多,占用空间就越多

什么是“槽”

为了提高“数据页”内查询数据的效率,innodb 设计了 “槽”

介绍“槽”之前先介绍,“组”

  • 对于 Infimum 记录所在的分组只能有 1 条记录, Supremum 记录所在的分组拥有的记录条数只能在 1 -- 8 条之间,剩下的分组中记录的条数范围只能是在 4 -- 8 条之间。
  • 当一个组的记录数等于 8 后,在插入一条记录,会将组中的记录拆分成两个组,其中一个组 4 条记录,另一个组 5 条件记录。

“槽”是怎么来的

  1. 将所有正常的记录(包括 Infimum Supremum 记录,但不包括已经移除到垃圾链表的记录)划分为几个组
  2. 每个组的最后一条记录(也就是组内最大的那条记录)相当于"带头大哥"组内其余的记录相当于"小弟”,“带头大哥"记录的头信息中的 n_owned 属性表示该组内共有几条记录
  3. 将每个组中最后一条记录在页面中的地址偏移量(就是该记录的真实数据与页面中第0个字节之间的距离〉单独提取出来,按顺序存储到 Page Directory, 页目录中这些地址偏移量称为槽 (Slot),每个槽占用2字节,页目录就是由多个槽组成的

File Trailer

保存页的校验和

一个数据页的示意图

在一个数据页中查找指定主键值的记录时,过程分为两步

  • 通过二分法确定该记录所在分组对应的槽,然后找到该槽所在分组中主键值最小的那条记录
  • 通过记录的 next record 属性遍历该槽所在的组中的各个记录

在 B+TREE 同一层的数据页与数据页之间是双向链表,数据页内记录与记录之间是单向链表

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-24 15:48:54  更:2021-08-24 15:49:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 8:04:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计