mysql的行格式

    mysql数据是以行的形式存储在数据页中,行与行之间造成一个长的链表。
mysql

    一行的数据除了insert into xxx values ();插入的数据外还存储了其余的数据信息,可是在执行client链接数据库查询数据时不会显示。
sql

    mysql行的格式有Compact,Redundant,Dynamic,Compressed四种,mysql5.5以上的默认compact格式,数据库

查看系统的row_format格式bash

MariaDB [(none)]> show variables like 'innodb_%format';
+--------------------+----------+
| Variable_name      | Value    |
+--------------------+----------+
| innodb_file_format | Antelope |
+--------------------+----------+

建立表的时候能够指定 row_format=compact

行数据存储compact格式网络

compact.jpg

1、变长字段长度列表

几个点了解一下:app

  1. 何谓变长?就是不定长。不定长从两个点理解: 字符集与属性类型ide

  2. 变长类型示例:varcharvarbinarytextblobspa

  3. 这些变长列的实际占用字节数以逆序方式存储在变长字段长度列表指针

    逆序就是: 根据表中字段先后顺序顺序反过来把字段的内容存储在该字段中日志

  4. 容许的最大字节超过255且实际存储超过127字节, 使用两个字节存储其长度, 不然使用一个字节.(看到有多节省了吗...)

  5. 变长列不为null时, InnoDB才会存储其字节长度

  6. 若是没有变长列或变长列都为null,则当前记录没有此部分

  7. 第一个字节的第一位是标志位,表示是否双字节表示.(有点像gbk哈)


2、NULL值列表

一样几个点了解一下:

  • 主键列、not null 修饰的列不在此范围内

  • 若是没有能够省略此部分。(即除了主键列全是not null修饰)

  • 一个列一个二进制位,1表示null

  • 一样逆序存放

  • 此部分由整数个字节组成, 不足地方高位补0


3、记录头信息

记录头信息.jpg


Compact行格式下记录头各部分示意图(来源网络)

名称 大小(单位:bit) 描述
预留位1 1 没有使用
预留位2 1 没有使用
delete_mask 1 标记该记录是否被删除
min_rec_mask 1 B+树的每层非叶子节点中的最小记录都会添加该标记
n_owned 4 表示当前记录拥有的记录数
heap_no 13 表示当前记录在记录堆的位置信息
record_type 3 表示当前记录的类型,0表示普通记录,1表示B+树非叶子节点记录,2表示最小记录,3表示最大记录
next_record 16 表示下一条记录的相对位置

这里一堆属性,咱们挑几个看看

delete_mask
  • 被删除的记录值为1, 正常记录为0

  • delete 语句后的记录不会被马上删除,而是将这条记录的delete_mask置1, 称为delete mask操做,与真正的直接删除要区分开(update不更新主键且不能就地更新时直接删除,也就是改完delete_mask后直接加入到垃圾链表中),这种操做是由于MySQL还有一个东东叫MVCC,后面会讲。

  • 这个属性还涉及垃圾链表、重用空间什么的

min_rec_mask
  • 该记录是否为B+树中非叶子节点的最小记录

n_owned
  • 在页面内为了快速搜索(二分查找)会分组

  • 只有组内最大记录此字段有值,记录组内记录数,除了最小记录,大小通常在4-8区间

heap_no
  • 后面咱们会说到记录在页面内其实会组成一个单链表,从头至尾,此属性依次增长.

  • 最小记录为0,最大记录为1,真正记录的这个值从2开始

record_type
  • 页内记录类型,目前有四种类型

  • 0就是咱们的通常意义上的记录,1是索引用到的,后面再说

  • 2是最小记录、3 是最大记录

next_record
  • 本记录的真正数据到下一条记录的真正数据的偏移量(能够当作存了个指针,向后是额外信息,向前是具体的列)

  • 根据这个属性,页面内全部记录都串了一个单链表

  • 单链表按主键排序,从小到大,最小记录与最大记录分别为头结点和尾节点


4、正式数据部分

列名 是否必须 占用空间 描述
row_id 6字节 行ID,惟一标识一条记录
transaction_id 6字节 事务ID
roll_pointer 7字节 回滚指针
这三个的位置在真正数据的最开始位置, 属于MySQL为咱们添加的隐藏列,不过也不是全部的状况都添加:
  • 表中没有指定主键且没有Unique列, MySQL会为咱们添加一个row_id 做为主键

  • 其余两个每条记录都会默认添加

  • trx_id 其实就是事务ID,这个是在五号表空间的全局变量

  • roll_pointer 回滚指针,指向一条undo日志记录(在undo日志记录页中)

  • MySQL有个自增的功能,实际上是维护了一个全局变量

  • 这个变量存储在系统表空间的7号表(7号表空间)中,随着记录的插入而自增, 每逢256的倍数就刷到磁盘中

  • 重启系统取出后加上256再赋予给自增列, 由于库中可能已经超过了刷到磁盘中的这个值

  • 最后一点, 强扭的瓜不只不甜也不解渴, 因此没看懂就不要勉强......

相关文章
相关标签/搜索