varchar变长字段是如何存储的

  1. 一行数据在磁盘的存储格式为:变长字段的长度列表,null值列表,数据头,column01值,column02值,column03值.
  2. 假设有两行数据hello,a,a;hi,a,a.字段类型为varchar(10),char(1),char(1).磁盘的储存格式为紧凑的一行hello,a,a,hi,a,a。
  3. 如何读取紧凑的一行,通过在头部存储的字段长度。比如说hello=5个字节,16进制为0x05.a已经确定为char类型,一个字节。再磁盘的存储格式为0x05,null值列表,数据头,hello,a,a。
  4. 如果有多个varchar类型。varchar(10) varchar(5) varchar(5) char(1) char(1) hello ni hao a a.多varchar的长度逆序存储,变成 0x03 0x02 0x05 null值表头 头字段 hello ni hao a a

    null值是如何存储的

  5. NULL值在磁盘上不会存”null”,存二进制bit位,如果是null,存1,不是null,存0。允许为null的都需要存,逆序存储。

  6. 假如有表:

image.png
jack null m null xx_school
4个变长字段,1个定长字段,4个非null。存储内容为:0x09 0x04 0101 头信息 字段值
null值列表要保证8位,要在前面补0,存储内容为:0x09 0x04 00000101 头信息 字段值

  1. 如果读取。根据列类型得到第一位不允许为null,变长,0x04读取4位。根据null值列表知道4个允许为null的,1010—null ,定长直接读取,null,0x09(读取长度为9)。这样的规律读取出jack null m null xx_school一行数据

    40bit位的数据头是如何存储的

    40bit位的数据头是用来描述这行数据的
    第一bit位和第二bit位是预留位
    一位是delete_mask,标识这行数据是否被删除
    一位是min_rec_mask,B+树每一层的非叶子节点最小值
    4位是n_owned,记录数
    13位是heap_no,这行数据在堆内存的位置
    3位的record_type,这行数据的类型
    16位的next_record,下一条数据的指针。

    一行数据在磁盘上是如何存储的

    数据是根据数据库指定的字符集编码,进行编码后再进行存储的。
    在存储一行数据的时候,会在他的真实数据部分加入一些隐藏字段。
    DB_ROW_ID,一个行的唯一标识,没有指定主键和unique_key唯一索引时,内部自动加ROW_ID为主键。
    DB_TRX_ID,事务相关
    DB_ROLL_PTR,回滚指针,进行事务回滚。
    实际存储数据:
    0x09 0x04 00000101 00000000000000000000000000000000000000002(40bit位) 000094 (DB_ROW_ID)
    000094 (DB_TRX_ID) 000094 (DB_ROL_PTR) 61661 23242 34s343

    数据在磁盘上的物理存储之后,什么是行溢出

    一般默认的数据页的大小是16kb,存放的数据长度超出大小,会被溢出区放在其他数据页,数据页中有20kb
    用来放溢出数据页的指针。