mysql中compact行的存储结构

  mysql中行的格式类型包括:Compact、redundant、dynamic、compressed这四种,行和行之间是通过一个单向链表的形式来连接的,而我在实际工作中最常用到的是compact类型。

  具体行的类型可以在create中看到,例如:

  

  compact行类型又是由:记录的额外信息和记录的真实数据组成。

  

   上图中的前五项:

      变长字段长度列表、NULL标志位、记录头信息组成了记录的额外信息

      列1数据、列2数据组成了记录的真实数据

  1.变长字段长度列表:存储的是行中的变长类型在真实数据中的长度其中变长类型包括:varchar、text、blob,变长类型的真实长度在变长字段长度列表中的存储是逆序存储的如果实际存储长度小于255则用一个字节表示,如果大于255则用两个字节表示

 

  2.NULL标志位:NULL标志位可以看作是NULL值列表,在表中的某些列中是可能存储NULL值的,如果把这些NULL值放到记录的真实数据中存储是很占用空间的,所以Mysql中Compact行格式会把这些列值为NULL的列统一进行管理并存储到NULL值列表中和变长字段长度列表一样它也是逆序存储的NULL值列表的存储不占用真实存储空间只占用NULL值列表,如果当前列为NULL值则用二进位1表示,当前列不为NULL值则用二进制位0表示,如果当前行中所有列都为NOT NULL则不会分配NULL列表的存储空间,在实际开发中创建表时都会设置为NOT NULL因为这样可以节省空间、提高整体的效率

 

  注意:在行信息中有些信息是隐藏的,Mysq会为每行记录都添加transaction_id和roll_pointer列,但row_id只会在表中没有定义主键的时候才会记录添加,相当于Mysql帮我们添加了一个主键

 

  varchar变长类型的行溢出:因为varchar是变长类型,所以在存储数据时超过一定长度(大致是8098字节)时会发生行一出,移除后的记录内容为:768字节+剩余内容的地址信息(20字节),注意这里不是超过768就会行溢出而是溢出后只存储768字节

  行溢出临界点判断的计算公式:136+2*(27+n) > 16384    其中n为列中实际存储的字节数

 

posted @ 2020-03-22 22:16  茴香饺子、  阅读(2076)  评论(0编辑  收藏  举报