compact格式下行记录的格式:
非null变长字段列表:按照列的顺序逆序放置,列的长度小于255,用1字节表达;大于255,则用2字节
NULL标志位:该行数据有null值用1表示,无用0表示
记录头信息:包含记录中列数,记录类型,页中下条记录的相对位置等信息 5字节
事务ID:6字节
回滚指针:7字节
Rowid:6字节
实际数据
注:char字段没全占用其长度空间,会用0x20填充;varchar和char中的null值都不会占用空间
在记录头信息中存在下条记录的相对位置(next_record):表明在页内部是通过链表的结构来串连各行记录的
redundant行记录格式:
字段长度偏移列表:按照列的顺序逆序放置,列的长度小于255,用1字节表达;大于255,则用2字节
记录头信息:与compact不同是占用了 6字节
Rowid
事务ID
回滚指针
注意:varchar中null值不占用空间,char中null值会占用空间
存放大对象列类型(blob)采用行溢出格式:
compressed和dynamic行记录格式对:在数据页中之存放20个字节的指针,实际数据存放在off page中
compact和redundant格式会存放768个前缀字节+偏移量(指向行溢出页),
varchar列数据类型也有可能被存放为行溢出数据:
mysql的varchar类型实际可以存放65532字节(在sql_mode为严格模式下创建varchar(65535)类型的字段会报错),
且字符类型为latin1.其他字符类型的varchar类型创建为65532会报错(原因:varchar(N)中的N表示字符长度)
且varchar(65535)中65535长度指所有varchar列的长度总和
innodb默认的页为16k,即16384字节怎么能存放65532字节(所以,在一般情况下,innodb的数据都存放在页类型为B-tree node中;当发生行溢出时,数据存放在页类型为Uncompressed BLOB 页中)
页中只能存放一条记录,则innodb会自动将行数据存放到溢出页中
当页中存放两行数据(阈值长度为8098),varchar类型的行数据就不会存放到行溢出页中(因为:innodb表示索引组织表即B+tree,每个页中至少应该存放两条行记录)
对于text和BLOB数据类型,他们也不总是存放在Uncompressed blob页中。是存放在数据页还是blob页中和varchar一样,至少保证一个页能存放两条记录
译者介绍:家华,从事mysqlDBA的工作,记录自己对mysql的一些总结