innodb行记录格式

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的一些总结


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值