Innodb引擎底层解析(六)

InnoDB 记录存储结构和索引页结构

InnoDB 是一个将表中的数据存储到磁盘上的存储引擎,所以即使关机后重 启我们的数据还是存在的。而真正处理数据的过程是发生在内存中的,所以需要 把磁盘中的数据加载到内存中,如果是处理写入或修改请求的话,还需要把内存 中的内容刷新到磁盘上。而我们知道读写磁盘的速度非常慢,和内存读写差了几 个数量级,所以当我们想从表中获取某些记录时,InnoDB 存储引擎需要一条一 条的把记录从磁盘上读出来么?

InnoDB 采取的方式是:将数据划分为若干个页,以页作为磁盘和内存之间 交互的基本单位,InnoDB 中页的大小一般为 16 KB。也就是在一般情况下,一次 最少从磁盘中读取 16KB 的内容到内存中,一次最少把内存中的 16KB 内容刷新 到磁盘中。

我们平时是以记录为单位来向表中插入数据的,这些记录在磁盘上的存放方 式也被称为行格式或者记录格式。InnoDB 存储引擎设计了 4 种不同类型的行格 式,分别是 Compact、Redundant、Dynamic 和 Compressed 行格式。
在这里插入图片描述

行格式
我们可以在创建或修改表的语句中指定行格式:
CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称

COMPACT
在这里插入图片描述

我们知道 MySQL 支持一些变长的数据类型,比如 VARCHAR(M)、 VARBINARY(M)、各种 TEXT 类型,各种 BLOB 类型,我们也可以把拥有这些数据 类型的列称为变长字段,变长字段中存储多少字节的数据是不固定的,所以我们 在存储真实数据的时候需要顺便把这些数据占用的字节数也存起来。如果该可变 字段允许存储的最大字节数(M×W)超过 255 字节并且真实存储的字节数(L) 超过 127 字节,则使用 2 个字节,否则使用 1 个字节。

表中的某些列可能存储 NULL 值,如果把这些 NULL 值都放到记录的真实数 据中存储会很占地方,所以 Compact 行格式把这些值为 NULL 的列统一管理起来,存储到 NULL 值列表。每个允许存储 NULL 的列对应一个二进制位,二进制位的 值为 1 时,代表该列的值为 NULL。二进制位的值为 0 时,代表该列的值不为 NULL。

还有一个用于描述记录的记录头信息,它是由固定的 5 个字节组成。5 个字 节也就是 40 个二进制位,不同的位代表不同的意思。
预留位1 1 没有使用
预留位2 1 没有使用
delete_mask 标记该记录是否被删除
min_rec_mask 1 B+树的每层非叶子节点中的最小记录都会添加该标记 n_owned 4 表示当前记录拥有的记录数
heap_no 13 表示当前记录在页的位置信息
record_type3 表示当前记录的类型,0 表示普通记录,1 表示 B+树非叶子
节点记录,2 表示最小记录,3 表示最大记录 next_record16 表示下一条记录的相对位置。
在这里插入图片描述

记录的真实数据除了我们自己定义的列的数据以外,MySQL 会为每个记录默 认的添加一些列(也称为隐藏列),包括:
DB_ROW_ID(row_id):非必须,6 字节,表示行 ID
唯一标识一条记录 DB_TRX_ID:必须,6 字节,表示事务 ID
DB_ROLL_PTR:必须,7 字节,表示回滚指针

InnoDB 表对主键的生成策略是:优先使用用户自定义主键作为主键,如果 用户没有定义主键,则选取一个 Unique 键作为主键,如果表中连 Unique 键都没 有定义的话,则 InnoDB 会为表默认添加一个名为 row_id 的隐藏列作为主键。 DB_TRX_ID(也可以称为 trx_id) 和 DB_ROLL_PTR(也可以称为 roll_ptr) 这两 个列是必有的,但是 row_id 是可选的(在没有自定义主键以及 Unique 键的情 况下才会添加该列)。
其他的行格式和 Compact 行格式差别不大。

Redundant 行格式
Redundant 行格式是 MySQL5.0 之前用的一种行格式,不予深究。

Dynamic 和 Compressed 行格式
MySQL5.7 的默认行格式就是 Dynamic,Dynamic 和 Compressed 行格式和 Compact 行格式挺像,只不过在处理行溢出数据时有所不同。Compressed 行格式和 Dynamic 不同的一点是,Compressed 行格式会采用压缩算法对页面进行压 缩,以节省空间。

索引页格式

前边我们简单提了一下页的概念,它是 InnoDB 管理存储空间的基本单位, 一个页的大小一般是 16KB。
InnoDB 为了不同的目的而设计了许多种不同类型的页,存放我们表中记录 的那种类型的页自然也是其中的一员,官方称这种存放记录的页为索引(INDEX) 页,不过要理解成数据页也没问题,毕竟存在着聚簇索引这种索引和数据混合的 东西。

数据页结构

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值