MySQL索引(六)——行格式

本文深入探讨了MySQL的Commpact行格式,包括变长字段长度列表的作用和注意事项,NULL值列表的设计原因,以及记录头信息的组成结构。通过详细的结构示意图,帮助读者理解这种行格式如何存储数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本使用:

概念:

我们插入的一条条的记录都是按照一定的行格式插入到数据页中的
相当于行格式就是我们插入的一条条记录,MySQL对其做了封装,成为了一个行格式。

语法:

 CREATE  TABLE   表名 (
            字段信息
     ) CHARSET=ascii     ROW_FORMAT =   COMPACT ;
指定行格式为  compact 

Commpact行格式结构:

变长字段长度列表:

作用:

MySQL支持一些变长的数据类型,比如VARCHAR(M)、VARBINARY(M)、TEXT类型,BLOB类型。
这些数据类型修饰列称为变长字段,变长字段中存储多少字节的数据不是固定的。
所以我们在存储真实数据的时候需要顺便把这些数据占用的字节数也存起来。
在Compact行格式中,把所有变长字段的真实数据占用的字节长度都存放在记录的开头部位。

注意事项:

这里面存储的变长长度和字段 顺序是反过来的。
比如两个varchar字段在表结构的顺序是a(10),b(15)。那么在列表中存储的长度顺序就是15,10
如下图所示:

NULL值列表

作用:

Compact行格式会把可以为NULL的列统一管理起来,存在一个标记为NULL值列表中。
如果表中没有允许存储 NULL 的列,则 NULL值列表也不存在了。

原因:为什么要定义NULL值列表?

因为数据都是需要对齐的,如果没有标注出来NULL值的位置,就有可能在查询数据的时候出现混乱。
如果使用一个特定的符号放到相应的数据位表示空置的话,虽然能达到效果,但是这样很浪费空间

记录头信息:

组成结构:

delete_mask:标记当前记录是否被删除
min_rec_mask:标记B+Tree的非叶子结点的最小记录
    注: 这个最小记录就是Innodb 自动插入的最小记录,不是我们插入记录
record_type:标记当前记录的类型。 值如下:
     0:表示普通记录
     1:表示B+树非叶节点记录
     2:表示最小记录
     3:表示最大记录
heap_no:表示该记录在本页中位置
注: 0 表示是MySQL插入的最小记录
        1 表示是MySQL插入的最大记录
n_owned:存储该组一共有多少条记录
注: 不是每一条记录都有的,只有该组的最后一条记录才有该标记
next_record:指针,指向下一个行记录

组成示意图:

真实数据:

记录的真实数据除了我们自己定义的列的数据以外,还会有三个隐藏列:

如下图所示:

row_id:一个表没有手动定义主键,则会选取一个Unique键作为主键。
如果连Unique键都没有定义的话,则会为表默认添加一个名为row_id的隐藏列作为主键。
所以row_id是在没有自定义主键以及Unique键的情况下才会存在的
transcation_id:事务id,记载最近的修改过当前行记录的事务的id
roll_point:回滚指针,指向该条行记录对应的Undo日志

结构示意图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值