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

Posted 鮀城小帅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于MySQL:26 每一行的实际数据在磁盘上是如何存储的?的主要内容,如果未能解决你的问题,请参考以下文章

Mysql中每一行的实际数据在磁盘上是如何存储的?

MySQL: 22 写入数据库的一行数据,在磁盘上是怎么储存的

一文讲清,MySQL数据库一行数据在磁盘上是怎么存储的?

MySQL:25 磁盘文件中,40个bit位的数据头以及真实数据是如何存储的

mysql一张表到底能存多少数据?

MySQL:24 一行数据中的多个NULL字段值在磁盘上怎么存储