InnoDB行存储之COMPACT

哈喽大家好,我是热心的大肚皮,皮哥。
上次我们简单说了下字符集,今天我们讲一下mysql中InnoDb是如何存储行记录的。

存储引擎

简单说一下mysql常用的存储引擎。

  • MEMORY
    数据只存储在内存,不存储在磁盘;多用于临时表。
  • MyISAM
    主要支持非事物处理。
  • InnoDB
    默认存储引擎,支持事务、行级锁、外键。
    主要将数据划分多个页,以页作为磁盘和内存之间交互基本单位,默认大小16KB,每次读写最小操作16KB,这个与服务器io有关,不过多讲解啦,大家知道就好。

InnoDB行存储

InnoDB行存储的方式分为COMPACT、REDUNDANT、DYNAMIC和COMPRESSED这四种。

COMPACT

每一行的存储信息如下图所示。
1.jpg

变长字段长度列表
变长字段

变长字段包括varchar(m)varbinary(m)、各种text类型、Blob类型,那什么是变长字段呢? 举个例子,变长字符串 varchar varchar(255) 所占资源空间是你存储内容的长度。 定长字符串 char char(8)不管你存储内容的长度是多少,它所占空间就是8,如果存储内容长度大于8,则会被截取。 varchar相较于char,更能节省资源空间。

如何存储?

内容所占字节数+数据内容,按照16进制存储,根据字段逆序存放,如果内容过大,部分数据则会溢出到其他页中(这个后续会说)。

null值列表

如果说把null都存储到真实信息里,会浪费空间,所以COMPACT把一行记录里的null字段统一维护到一起。采用16进制存储。

处理过程:
  1. 统计行中的null值列有哪些
  2. 如果不存在null值列则无null值列表,否则逆序存放,采用二进制存储,1为null,0为非null。
  3. 如果二进制位数不够整数个字节,则高位补0。(例如3个字段都是null,则表示为111,但是不够整数个字节,则改为00000111)。
记录头信息
  • deleted_flag
    标记记录是否删除,采用二进制表示。举个例子,其实在mysql中删除数据时,也不是马上删除,而且打上标记,在进行删除
  • next_record
    下一条记录的相对位置。
记录的真实数据
隐藏列
  • 行id,row_id,唯一标识,6个字节,如果未定义主键则默认添加row_id作为主键。
  • 事物id,trx_id,6个字节。
  • 回滚指针,roll_pointer,7个字节。
真实数据

各个字段真正的数据。

非变长字段

我们上面讲解了变长字段的存储及每一行数据如何存储,那么非变长的字段如何存储呢? 举个列子,char(10)如果采用utf8字符集的话,所占空间为10-30个字节,在新增时会直接申请真正使用的空间,null的话则会申请10个字节,修改时如果小于当前空间则直接更新,一定程度避免了空间碎片。

后面的3种格式,下篇会统一介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热心的大肚皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值