究极无敌细节版 Mysql索引( 三 )


文章插图

  • 变长字段列表:如varchar(m),Text,Blob类型的列,称为变长字段,由于其字节数量不固定,需要在变成字段列表中存储这些字段的长度,在记录的真实数据中存储内容
  • null值列表:如果表中没用允许为null的列,那么null值列表就不存在,否则把每一个允许为null的列使用一个二进制位来表示,二进制为1的时候表示值为null
  • 记录头信息:占用五个字节,其中包含delete_flag(标记记录是否被删除)next_record(下一条记录的相对位置)等信息
  • 记录的真实信息:如果表没用定义主键,也没有唯一不可重复不可为null的列,那么innodb为我们生成一个隐藏列row_id,如果定义了主键那么此列不存在,并且还有trx_id,roll_pointer两个隐藏列,后续便是每一个列的真实数据 。(char(M)类型的列,如果使用定长字符编码,那么字节数不会加到变长字段列表中,如果使用变长编码,占用长度会加入到变成字段列表中(变长编码那么必须占用M个字节,varchar(M)则没用这个要求
  • REDUNDANT
    究极无敌细节版 Mysql索引

    文章插图
    • 字段长度偏移列表:此种行格式会把记录所有列长度的偏移信息存储
    • null值的处理方式:先看偏移量的null比特位是否为1,如果为了那么表示为null
  • 溢出列
    如果一个列太长,并不会傻乎乎的存储所有数据在行记录中,而是使用溢出列COMPACTREDUNDANT只会存储该列的前768字节然后存储指向其他页的地址,剩下的数据存在其他页中 。
  • DYNAMIC和COMPRESSED
    COMPACT类似,但是二者不会存储过长列的前768字节,而是把真实数据都存储到溢出中,记录只存储溢出页的地址 。COMPRESSED 还会使用压缩算法对页面进行压缩
  • 2.InnoDB页结构页是InnoDB管理存储空间的基本单位,其默认大小为16k,InnoDB设计了很多不同的页结构:存放Change Buffer的页存储undo log 日志的页等等 。对于表中数据,也存在在页中
    究极无敌细节版 Mysql索引

    文章插图
    最开始的时候UserRecords并不存在,随着数据的插入,会从FreeSpace中申请一个记录大小的空间,将其划分到UserRecords部分,当FreeSpace用完只会继续插入就需要申请新的页 。
    2.1行结构中记录头信息的作用