MySQL架构(四)- 磁盘存储行格式

MySQL服务器上负责对表中的数据的读取和写入工作的部分是存储引擎,而服务器又支持不同类型的存储引擎,真实数据在不同存储引擎存放的格式一般也是不同的

1、InnoDB行格式

每行数据在磁盘上的存放方式被称为行格式或者记录格式,InnoDB有4中不同的行格式,Compact、Redundant、Dynamic和Compressed行格式

1.1 compact行格式

上图分析出,一条完整的记录其实被分为额外信息和真实数据两部分

1.1.1  额外信息

         存储引擎为了描述这行数据不得不添加的一些信息,主要包括3类:变长字段长度列表、NULL值列表、记录头信息

1.1.1.1  变长字段列表

         MySQL支持一些变长的数据类型(VARCHAR(M)、VARBINARY(M)、各种TEXT类型,各种BLOB类型),把这些数据类型的列作为变长字段,变长字段存储多少字节的数据是不固定的,所以我们在存储这些数据的时候需要把这些数据占用的字节数也存起来,这样才不至于把MySQL服务器搞蒙;所以这些变长字段占用的存储分为两部分

  • 真正的数据内容
  • 占用的字节数

在Compact行格式中,把所有变长字段的真实数据占用的字节长度都存放在记录的开头部位;从而形成一个变长字段长度列表,各变长字段数据占用的字节数按着列的顺序逆序排放

需要注意的是:变长字段长度列表中只存储值为非NULL列内容占用的长度,值为非NULL列的长度是不存储的

1.1.1.2  NULL值列表(用一个bit来标记NULL的列,代替使用NULL来标记真实数据,可以省空间)

         表中某些列可能存储NULL值,这些NULL值都放到真实的数据中存储会占很多地方,所以Compact格式把这些NULL值的列统一管理,存储在NULL值列表。处理过程如下

1.1.1.3  记录头信息

         描述记录的记录头信息,是由固定的5个字节组成,5个字节也就是40个二进制位,不同的位代表不同的意思

这些二进制位代表的详细信息如下

1.1.2 真实数据

       真实数据中除了插入的数据外,其实还包括MySQL默认添加的一些列

1.1.3  行溢出

VARCHAR(M)最多能存储多少字节的数据

VARCHAR(M)类型的列最多可以占用65535字节,其中的M代表该类型最多存储的字符数量,如果我们使用ascii字符集的话,一个字符就代表一个字节,我们看看VARCHAR(65535)是否可用:

报错分析出,MySQL对一条记录占用的最大存储空间是有限制的,除了BLOB OR TEXT类型的列之外,其他所有的列(不包括隐藏列和记录头信息)占用的字节长度加起来不能超过65535个字节。所以MySQL服务器建议我们把存储类型改为TEXT或者BLOB的类型。这个65535个字节除了列本身的数据之外,还包括一些其他的数据(storage overhead),比如说我们为了存储一个VARCHAR(M)类型的列,其实需要占用3部分存储空间:

1、真实数据

2、真实数据占用字节的长度

3、NULL值标识,如果该列有NOT NULL属性则可以没有这部分存储空间

所以一行数据太多造成数据行溢出

我们以ascii字符集下的varchar_size_demo表为例,插入一条记录:

其中的REPEAT(‘a’, 65532)是一个函数调用,它表示生成一个把字符’a’重复65532次的字符串。前边说过,MySQL中磁盘和内存交互的基本单位是页,也就是说MySQL是以页为基本单位来管理存储空间的,我们的记录都会被分配到某个页中存储。而一个页的大小一般是16KB,也就是16384字节,而一个VARCHAR(M)类型的列就最多可以存储65532个字节,这样就可能造成一个页存放不了一条记录的尴尬情况。

在Compact和Reduntant行格式中,对于占用存储空间非常大的列,在记录的真实数据处只会存储该列的一部分数据,把剩余的数据分散存储在几个其他的页中,然后记录的真实数据处用20个字节存储指向这些页的地址(当然这20个字节中还包括这些分散在其他页面中的数据的占用的字节数),从而可以找到剩余数据所在的页,如图所示:

从图中可以看出来,对于Compact和Reduntant行格式来说,如果某一列中的数据非常多的话,在本记录的真实数据处只会存储该列的前768个字节的数据和一个指向其他页的地址,然后把剩下的数据存放到其他页中,这个过程也叫做行溢出,存储超出768字节的那些页面也被称为溢出页。画一个简图就是这样:

最后需要注意的是,不只是 VARCHAR(M) 类型的列,其他的 TEXT、BLOB 类型的列在存储数据非常多的时候也会发生行溢出

1.2 Redundant行格式

结构图如下,其他一样:

1.4 Dynamic和Compressed行格式

这两种行格式类似于COMPACT行格式,只不过在处理行溢出数据时有点儿分歧,它们不会在记录的真实数据处存储字符串的前768个字节,而是把所有的字节都存储到其他页面中,只在记录的真实数据处存储其他页面的地址。
另外,Compressed行格式会采用压缩算法对页面进行压缩。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值