大型数据库——表的存储原理

Posted 小姚同学要继续加油呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大型数据库——表的存储原理相关的知识,希望对你有一定的参考价值。

数据行(记录)结构

1、定长记录
在定长记录里,每个字段都有固定的长度,而且字段数也是固定的。这种记录的字段能够连续存储,因此在给定记录地址的情况下,借助系统目录里有关字段的长度信息就能计算出某个特殊字段的地址。

2、变长记录
对于变长记录来说,一种可能的记录组织方式就是像定长记录一样连续地存放字段,字段之间通过分割符隔开。这种组织方式需要扫描记录才能定位需要访问的字段。

另一种方法是在变长记录开始处预留一些空间作为存放一个整数偏移量数组的空间,数组中的第1个整数表示记录的第1个字段的起始地址,当然这个地址是相对于记录的起始地址的。另外在数组中也存储记录尾部的偏移量,这个偏移量用来识别最后一个字段的结束位置。

举例说明

1、 SQL Server定长记录的存储

CREATE TABLE Fixed
(
col1 int              NOT NULL,
col2 char(5)          NOT NULL,
col3 char(3)          NULL,
col4 float            NOT NULL
)

当这个表被创建以后,就有类似下面一个记录被插入到sysindexes系统表中:

id            name           indid         first          minlen
2099048       Fixed            0          0x000000000000    24

而其各个字段则会被插入到syscolumns系统表中:

name       colid        xtype        length            xoffset
col1         1           56            4                  4
col2         2           175           5                  8
col3         3           175           3                  13
col4         4           62            8                  16

当往Fixed表中插入一个记录数据时,例如:

INSERT INTO Fixed VALUES(123,‘ABCD’,NULL,45.5)

Fixed表在sysindexes系统表里的内容就会发生变化:

id        name       indid       first          minlen
2099048  Fixed        0       0x720000000000     24

这说明在插入了一记录数据之后,SQL Server就为Fixed表分配了一个数据页。Fixed表只包含四个定长字段sysindexes表中minlen字段的值表示记录的最小长度,该长度恰好是syscolumns表中表示字段长度的length的数字之和再加上4个字节。其中额外的4个字节是用于记录字段数目的两个字节和表示字段中NULL的字节数。
在这里插入图片描述
解析:
第一个字节是状态位A,它的值是0x10,表示只有位4是1,其他位都是0,因此该记录没有变长字段(如果位5为1说明存在变长字段)。
2-3字节:1800,说明在16+8=24个字节位置存储的总字段数,即所含字段总数存储在24字节。
4-23字节:存储内容的ASC码形式。
24-25字节:0400,转换为0004,说明有4个字段(4个消息块)
26-27字节:04,表示NULL位图,转换为二进制即为0000 0010,表示第二个字段(从0开始数)插入值为NULL。

2、 SQL Server变长记录的存储

CREATE TABLE Variable
(
col1 char(3)              NOT NULL,
col2 varchar(15)          NOT NULL,
col3 varchar(5)           NULL,
col4 varchar(10)          NOT NULL,
col5 smallint             NOT NULL
)

当这个表被创建以后,就有类似下面一个记录被插入到sysindexes系统表中:

id            name           indid         first          minlen
18099105      Variable        0          0x000000000000    9

而其各个字段则会被插入到syscolumns系统表中:

name       colid        xtype        length            xoffset
col1         1           175            3                  4
col2         2           167           15                 -1
col3         3           167           5                  -1
col4         4           167           10                 -1
col5         5           52            2                   7

当往Variable表中插入一个记录数据时,例如:

INSERT INTO Variable VALUES(‘xyz’,‘abcde’,NULL,123,999)

Variable表在sysindexes系统表里的内容就会发生变化:

id        name   indid      first          minlen
18099105 Variable  0      0x880000000000    9

定长字段的数据位于记录中由syscolumnsxoffset值指定的字节偏移量所在的位置,即col1起始于字节偏移量4的位置,而col5起始于字节偏移量7的位置。
在这里插入图片描述
解析:
0-1字节:3000,转换为0030,0000 0011 0000,说明是变长字段的存储。
2-3字节:0900,转换为0009,即十进制数字9,说明字段总数信息的存储位置是在第九位。
4-8字节:几个定长字段的存储内容。
9-10字节:总字段数,包含了定长字段数和变长字段数总和(总信息数)。
11字节:04,NULL位图,二进制为0000 0010,表示第二个插入值为NULL,当存储完了定长字段和总字段数之后,就必须存储NULL位图。
12-13字节:变长字段数:0300转换为0003,表示有3个变长字段。
14-15字节:1900,转换为0019,即十进制的25,表示第一个变长字段结束位置。
16-17字节:1900,和上面相同,表示第二个变长字段实际长度为0,没有任何信息存储在变长数据区域。
18-19字节:1c00转换为十进制的28,表示第三个变长字段结束为止为28,换句话说,目前整个记录的实际长度是28个字节长。
20-24字节:存储的是第一个变长字段的信息。由于第二个变长字段没有任何信息,因此下面的字节存储的是第三个变长字段的信息。
25-28字节:存储的是第三个变长字段的信息。

总结:按照字节存储的顺序

1.表示存储方式,变长(1000)还是定长(3000)
2.存储总字段数信息的字节位数,通过这个信息,再找一次,进而得知总共存储了多少个信息段(定长和变长字段总数)。(好比一个指针)
3.存储定长字段信息。
4.总字段数信息
5.NULL位图
6.变长字段数信息
7.每一个变长字段的结束位置信息
8.变长字段信息

以上是关于大型数据库——表的存储原理的主要内容,如果未能解决你的问题,请参考以下文章

数据库系统原理 片段翻译

如何管理跨多个表的大型数据集? UNION 与大表?

初步学习:hash存储和hash表的原理

初步学习:hash存储和hash表的原理

大型数据库——索引存储结构

大型数据库——索引存储结构