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) 页,不过要理解成数据页也没问题,毕竟存在着聚簇索引这种索引和数据混合的 东西。

数据页结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值