MySQL之InnoDB引擎(四)

1     InnoDB介绍

2     InnoDB架构

2.1   内存存储架构

2.1.1 缓冲池(Buffer Pool)

2.1.1.1 缓冲池LRU算法

2.1.1.2 缓冲池配置

2.1.1.3 监控缓冲池

2.1.2 缓冲变化(Change Buffer)

2.1.2.1 索引类型介绍

2.1.2.2 缓冲变化定义

2.1.2.3 缓冲变化配置

2.1.2.4 最大空间配置

2.1.2.5 缓冲变化监控

2.1.3  适应性哈希索引(Adaptive Hash Index)

2.1.4 缓冲日志(Log Buffer)

2.2   磁盘存储架构

2.2.1 数据表(Tables)

2.2.1.1 数据表的创建

2.2.1.2 外部表的创建

2.2.1.3 导入表数据文件

2.2.1.4 移动或者复制数据表

2.2.2 数据的物理结构

本章节主要描述数据表在磁盘中的物理存储结构。数据记录的结构如下所示,主要由三部分组成:

名称

大小

描述

字段起始偏移量

(F*1) or (F*2)字节,其中F标识字段的数量

数字列表,标识每个字段的起始存储位置(以偏移量的方式)

拓展字节

6字节

固定大小的头部信息

字段内容

大小依赖于具体字段定义的大小

实际数据,保存字段值

2.2.2.1 字段起始偏移量

该字段是一个列表,列表中的每个元素标识一个位置,位置偏移量表示的是相对于起始位置的偏移量,从列表中的位置偏移量可以定位到下一个字段的起始位置,从而可以读取到每个字段的值。该列表中的元素顺序是逆序的,也就是最后一个字段的位置偏移量排在列表的第一位。

例如,假定有三个字段,第一个字段的长度是1,第二字段的长度是2,第三个字段的长度是4,则这个三个字段的位置偏移量分别是1、1+2=3、1+2+4=7,也就是,1标识第二元素的起始位置,3标识第三个字段的起始位置,7标识下一个元素的起始位置,因为只有三个元素,7标识第三个元素的结束位置。因此,在列表中的元素的排列顺序是07、03、01。

字段起始偏移量有两点说明:

1.每个偏移量的大小可以是1字节或者2字节,1字节长度的表示记录总长度是小于127,在扩展字段中可以标识偏移量的大小是1字节、2字节

2.偏移量中可以包含标识位,如下所示:

偏移量大小是1字节

第一位是标识位(NULL位),其他7位表示偏移量的值(范围是0到127)

偏移量大小是2字节

第一位是标识位(NULL位),第二位是标识位(0标识偏移量与字段值在同一个页,1标识偏移量与字段值在不同的页,大字段BLOB类型位于不同的页),其他14位表示偏移量的值(范围是0到16383)

2.2.2.2 扩展字节

物理结构中该字段是固定大小,等于6个字节长度,共计48位,每个位描述如下所示:

名称

大小(48bits)

描述

NULL位

1bit

未使用

NULL位

1bit

未使用

deleted_flag

1bit

标识记录已被删除

min_rec_flag

1bit

标识预先定义为小记录

n_owned

4 bits

总记录数

heap_no

13 bits

堆区中索引页的顺序数值

n_fields

10 bits

记录的字段个数,范围从1到1023

1byte_offs_flag

1 bit

值等于1标识字段偏移量是1字节,值等于0标识字段偏移量是2字节

next 16 bits

16 bits

下一页的指针


由以上可知,如果读取字段中的值,需要先读取字段位置偏移量,即先读取1byte_offs_flag位中的标识值确定每个字段偏移量的长度。读取字段值的流程如下所示:

1.字段读取的指针位于初始位置Y

2.让X= n_fields

3.假如1byte_offs_flag值等于0,则让X=X*2

4.让X=X+6,其中6表示扩展字段的长度

5.字段开始读取的位置=Y-X

2.2.2.3 字段内容

记录中的每个字段是按照数据表格中的定义顺序以及字段的长度保存,字段之间没有分隔符。下面举例说明数据表格的物理存储结构。

1.创建数据表格

CREATE TABLE T

     (FIELD1 VARCHAR(3), FIELD2 VARCHAR(3), FIELD3 VARCHAR(3))

     Type=InnoDB;

对于数据表格T,实际上该表格创建了6个字段,3个系统字段以及3个用户定义的字段。MySQL在表格创建时,在开始位置自动添加了3个系统字段,这三个字段分别是记录行ID事务ID事务回滚指针。用户定义的字段分别是FIELD1FIELD2FIELD3

2.插入记录

INSERT INTO T VALUES ('PP', 'PP', 'PP');

INSERT INTO T VALUES ('Q', 'Q', 'Q');

INSERT INTO T VALUES ('R', NULL, NULL);

在数据表T中插入三行记录

3.从MySQL的数据文件ibdata1获取物理存储结构

如上所示,Address Values in Hexadecimal表示地址空间以及对应的值(十六进制),Values in ASCII表示以ASCII码的形式展示的值。

如上所示,T数据表格总共插入三行数据,从16进制的地址空间与对应的值中提取分析所得。

  • 第一行数据记录分析

其中19 17 15 13 0C 06列表表示6个字段(系统字段与用户定义字段)偏移的起始位置,每个字段占用的字节长度分别是6、6、7、2、2、2,计算所得字段偏移位置分别是6、6+6=12、6+6+7=19、6+6+7+2=21、6+6+7+2+2=23、6+6+7+2+2+2=25,计算所得的十进制值是6、12、19、21、23、25,计算从十进制转换成16进制是06、0C、13、15、17、19。因为字段的位置偏移量列表是逆序的,所以倒序所得19、17、15、13、0C、06。其余两行记录也使用相同的分析方法。

  • 扩展字段分析:

00 00 78 0D 02 BF列表表示扩展字段的6个字节,每个字节8位,共计48位的长度。其中0D是十六进制,转换成二进制位1101,其中110表示n_fields值,110转换成十进制是6,表示共计6个字段。1101中最后一位是1,对应的1位是1byte_offs_flag值,表示字段位置偏移量是1字节长度。02 BF表示最后两个字节,包含了指向下一记录页的字段位置,对应地址空间中的数据页是0D42BF(对应的地址空间是0D42B0),从该位置获取下一字段的位置偏移量。

(未完待续)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangys2006

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值