MySQL:26 每一行的实际数据在磁盘上是如何存储的?

一行数据在磁盘文件里传输的时候,首先会包含自己的变长字段的长度列表,然后是NULL值列表,接着是数据头,然后接着才是真实数据。

以下是一行数据在磁盘上的存储机制:

首先在存储真实数据的时候,就是按照字段的数据值去存储的。

用前面的例子,有一行数据为:"jack NULL m NULL xx_school",那么它真实数据存储大致如下:

0x09 0x04 00000101 0000000000000000000010000000000000011001 jack m xx_school

刚开始是变长字段的长度,用十六进制来存储,然后是NULL列表,指向了谁是NULL值,接着是40个bit位的数据头,然后是真实的数据值在最后面。

在读取这个数据的时候,他会根据变长字段的长度,先读取出 jack 这个值,因为他的长度是4,就读取4个长度的数据,jack就出来了。

然后发现第二个字段是NULL,就不读取了;

第三个是定长字段长度,直接读取1个字符就可以了,就是m这个值;

第四个字段是NULL,不读取了;

第五个字段是变长字段长度为9,读取出来 xx_school 就可以了。

一行数据真正在磁盘上存储的格式

当以上的一行数据真正存储到磁盘上时,那些字符串并不是那样直接存储在磁盘上的。

实际上字符串都是根据数据库指定的字符集编码,进行编码之后再存储的,所以一行数据在编码后结果如下所示:

0x09 0x04 00000101 0000000000000000000010000000000000011001 616161 636320 6262626262

如上面所示,一行数据的字符串和其他类型的数值最终会根据字符集编码后,以一些数字和符号存储在磁盘上。

关于隐藏字段

在存储一行数据的时候,还会在它的真是数据不符,加入一些隐藏字段。

首先有一个DB_ROW_ID字段,这是一个行的唯一标识,是它数据库内部给你搞的一个标识,不是主键ID字段。在没有指定主键和unique key唯一索引的时候,它内部自动加一个ROW_ID作为主键。

接着是一个DB_TRX_ID字段,这是跟实物相关的,是说这是哪个事务更新的数据,这是事务ID。

最后是DB_ROLL_PTR字段,这是回滚指针,是用来进行事务回滚的。

在加上这几个隐藏字段之后,实际一行数据可能看起来如下所示:

0x09 0x04 00000101

0000000000000000000010000000000000011001

00000000094C(DB_ROW_ID) 00000000032D(DB_TRX_ID) EA000010078E(DB_ROL_PTR)   616161 636320 6262626262

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值