InnoDB 是 mysql 的默认设置模块,也是大家最常见的,因此根据 InnoDB,学习培训页构造。而学习培训页构造,是为了更好地更强的学习培训数据库索引

一、页的介绍

页是 InnoDB 管理方法储存空间的基本要素,一个页的尺寸一般是 16kb。

为了更好地达到不一样的目地,创作者设计方案了各种类型的页,例如:

  • 储放磁盘空间头顶部信息内容的页
  • 储放 change buffer 信息内容的页
  • 储放 inode 信息内容的页
  • 储放 undo 日志信息内容的页
  • ... ...

殊不知大家最关注的,或是这些储放进表中这些数据信息纪录是在哪一种页上,官方网称这类储放纪录的页为数据库索引(INDEX)页,可是为了更好地有利于了解,这篇暂把它称之为数据信息页

二、数据信息页的构造

这数据信息页也是有 16kb 的储存空间,能够 大概区划为 7 个一部分。

从框架图中能够 见到,有一些一部分的占有字节是明确的,有些是不确定性的。大家最关注的客户储存的纪录,在 User Records一部分。

但是,在一开始转化成页的情况下,并沒有 User Records 一部分。当有新的纪录插进时,便会从 Free Space一部分申请办理一个纪录尺寸的室内空间,随后区划到 User Records 一部分,直至 Free Space 所有被 User Records 取代,表明这一页早已用完。假如也有新的纪录插进,必须 申请办理新的页。

我认为这儿能够 把这个数据信息页作为是书籍的页,书册上的內容一般 是一行行的展现,当全部页都用完后,就得翻到下一页(新页)去再次写了。

三、纪录在页中的存储结构

那麼,User Records 一部分里的这种纪录,是怎么管理的呢?

先來建一张表:

CREATE TABLE pingguo_demo(
	c1 INT,
	c2 INT,
	c3 VARCHAR(10000),
	PRIMARY KEY (c1)
	) CHARSET = ASCII ROW_FORMAT = COMPACT;

这儿的特定应用行文件格式为 COMPACT(模块中还存有别的的行文件格式),姑且了解 COMPACT 就可以。

在我们在数据库查询的插入了一条纪录后,实际上 身后的行文件格式是那样的:

留意这儿橘色标志的纪录头信息内容,它又包括了许多重要信息:

  • 预埋位1:占有 1 比特犬,沒有应用。
  • 预埋位2:占有 1 比特犬,沒有应用。
  • deleted_flag:占有 1 比特犬,标识该纪录是不是被删掉。
  • min_rec_flag:占有 1 比特犬,在 B 树(后边数据库索引会讲到)中各层非 叶子节点中的最少的文件目录项,都是会加上此标识。
  • n_owned:一个网页页面中的纪录被分成多个组,每一个组里有一个纪录是“哥哥”,别的纪录全是“小兄弟”。而这名“哥哥”纪录的 n_owned 便是所属组的全部纪录总数,而小兄弟们的 n_owned 全是 0
  • heap_no:占有 13 比特犬,表明当今纪录在网页页面堆中的相对位置。
  • record_type:占有 3 比特犬,表明当今纪录的种类,0是一般纪录,1是 B 树非叶连接点的文件目录项纪录,2是 Infimum 纪录,3是 Suprememum 纪录。
  • next_record:占有 16 比特犬,表明下一条纪录的相对位置。

四、纪录头信息内容

如今,向上边新创建的表中插进 4 条纪录:

INSERT INTO pingguo_demo VALUES
	(1, 100, 'aaaa'),
	(2, 200, 'BBBB'),
	(3, 300, 'cccc'),
	(4, 400, 'dddd');

那麼,相匹配这4条纪录的行文件格式应当为:

留意,这儿为了更好地有利于记忆力,作了简单化。此外,纪录中的信息内容具体是二进制位数据信息,这儿为了更好地了解写的是十进制。并且,各个纪录在 User Records 中储存是沒有间隙的,这儿抽象性表明。

1. deleted_flag

这一特性用于标识当今纪录是不是被删掉,1 表明被删掉,0 表明沒有被删掉。

嗯?我表中删除了数据信息竟然仍在页里

是的,你觉得被删除了,实际上 仍在硬盘上。为什么呢?

由于假如在硬盘上清除这种纪录,还需要再重新排序别的纪录,会产生特性耗费,因此只打过一个删掉的标识。

随后,全部的删掉的纪录会构成一个废弃物单链表。而纪录在这个单链表中所占有的室内空间称之为可器重室内空间,当后边有新纪录插进到表格中,他们就很有可能遮盖掉这种室内空间。

2. min_rec_flag

在 B 树中各层非叶子节点中的最少的文件目录项,都是会加上此标识。这儿说的文件目录项,要事后解读。

这儿4条纪录的 min_rec_flag 全是 0,表明都并不是 B 树非叶子节点中的最少的文件目录项纪录。

3. n_owned

要下一章解读。

4. heap_no

表明当今纪录在网页页面堆中的相对位置。

上边的4条纪录是抽象性的叙述,事实上这种纪录全是一条一条密切无缝拼接排序在一起的,这就是堆(heap)

为了更好地便于管理,把一条纪录在堆中的相对位置称之为 heap_no。

  • 在网页页面前边的纪录 heap_no 相对性较小
  • 在网页页面后边的纪录 heap_no 相对性很大
  • 每申请办理一条纪录的储存空间时,该纪录比物理学部位在它以前的那一条纪录的 heap_no 值大 1

以上 4 条纪录的 heap_no 各自为 2、3、4、5,嗯?怎么没有 0 和 1?

虚似纪录-Infimum 和 Supremum

这一在文中第二一部分有提及过。实际上 这2条纪录是页里全自动加上的:

  • Infimum:意味着网页页面中的最少纪录
  • Supremum:意味着网页页面中的较大 纪录

创作者要求,不管向页中插入了是多少条纪录,一切客户纪录都比 Infimum 纪录大,都比 Supremum 纪录小。

这 2 条虚似纪录的构造也非常简单。

因此,针对上边插进的 4 条客户纪录,还应当再加上这两个默认设置纪录,并且部位较近前。

此外,还必须 留意,当堆中纪录的 heap_no 值分派后,就不容易产生修改。即便删除了堆中的某条纪录,这条删掉纪录的 heap_no 值也依然不会改变。

5. record_type

这一特性表明当今纪录的种类,共 4 种:

  • 0:表明一般纪录
  • 1:表明 B 树非叶连接点的文件目录项纪录
  • 2:表明 Infimum 纪录
  • 3:表明 Supremum 纪录

6. next_record

这一特性很重要,表明从当今纪录的真正数据信息到下一条纪录的真正数据信息中间的间距

  • 特性数值正数:表明当今纪录的下一条纪录在当今纪录的后边。
  • 特性数值负值:表明当今纪录的下一条纪录在当今纪录的前边。

例如,第 1 条纪录的 next_record 数值 32,那麼此后纪录的真正数据信息详细地址向后找 32 字节数便是下一条纪录的真正数据信息。再例如,当值为 -111,那麼就意味着此后纪录往前找 111 字节数。

很了解?没有错,便是单链表

  • 下一条纪录,就是指依照外键约束由小到大排序的下一条。
  • Infrimum 纪录的下一条纪录,便是本页中主键值最少的客户纪录。
  • 本页主键值较大 的客户纪录的下一条纪录,便是 Supremum 纪录。

因此,如今再去再次看下纪录中间的平面图,能够 用单向链表来叙述了

假如此刻,删除在其中的某条纪录,更改的是表针。




文中参照书本: 小朋友4919 《mysql是怎样运行的》
--不能用肉身的努力,去遮盖思索的懒散--

评论(0条)

刀客源码 游客评论