innodb 存储引擎之:记录的数据结构,数据页的数据结构

本文深入探讨了InnoDB存储引擎的行格式,包括COMPACT、REDUNDANT、DYNAMIC和COMPRESSED四种类型,重点解析了COMPACT行格式下的记录额外信息,如变长字段长度列表和NULL值列表。同时,详细介绍了InnoDB数据页的结构,如FileHeader、PageHeader、Infimum+Supremum、UserRecords、FreeSpace、PageDirectory和FileTrailer,以及数据查找的流程。此外,还讨论了页的分配和使用情况,以及页目录中的‘槽’概念,旨在提高数据查询效率。

目录

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 同一层的数据页与数据页之间是双向链表,数据页内记录与记录之间是单向链表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值