mysql行格式_mysql-innodb行记录格式

行记录格式

可以通过show table status like 'table_name'命令查看当前表使用的行格式(row_format字段)

row_format

redundant,最早的行格式

2f88d624aa58d1ddc735778b55ca5730.png

首部是字段长度偏移列表,按照列的顺序逆序放置,其长度为(若列的长度小于255字节,用1字节表示;若大于255个字节,用2字节表示)

记录头信息:占用6字节,含义如图:

6b47cc633c9f53c12afc6b900b3a749b.png

说明:n_fields值代表一行中列的数量,mysql一行中最多的列为1023;1byte_offs_flag:定义了偏移列表占用1字节还是2字节。

最后部分即为实际存储的每个列的数据

注意:对于varchar类型的NULL值,不占用任何存储空间,而char类型的NULL值需要占用空间

compact,5.0.3以后默认行格式

1b6dd8b3c665762bf2de82c183146d0f.png

说明:

首部是一个非NULL变长字段长度列表,且按照列的顺序逆序放置,其长度为(若列的长度小于255字节,用1字节表示;若大于255个字节,用2字节表示)

NULL标志位:该行数据是否有NULL值,有则用1表示,占用1个字节

记录头信息:固定占用5字节,含义如图:

13e5f7aa666ea2a2abf3881efb8281b5.png

说明:通过record_type分析可得,在innodb存储引擎中页内部是通过一种链表的结构来串连各个行记录的。

最后的部分为实际存储每个列的数据(注:1.不管是char类型还是varchar类型,NULL不占该部分任何空间,只占有NULL标志位;2.固定长度char字段在未能完全占用其长度空间时,会用Ox20来进行填充)

每行数据除了用户定义的列外,还有两个隐藏列(事务ID(DB_TRX_ID)6字节,回滚指针列(DB_ROLL_PTR),7字节),若没有定义主键,还会增加一个rowid(DB_ROW_ID)6字节

Antelope文件格式包括compact和Redundant行记录格式

Barracuda文件格式包括dynamic和compressed行记录格式

行溢出数据

compact和redundant存放BLOB的行溢出数据存储格式如图:

b6b03201e5a86892d876ed955be4264c.png

说明:如果可以在一个页中至少存放两行数据,那么varchar类型的数据就不会存放到BLOB页中;当长度超过8098后,就会将溢出的数据存放在BLOB页中。

varchar(N)中N指的是字符的长度,而文档说明中varchar类型最大支持65535单位是字节且指的是所有varchar列的长度总和。

dynamic和compressed存放在BLOB中的数据采用的行溢出方式如图:

ffe20923ad2dfdb0351a87b53d16e896.png

说明:在数据页中只存放20个字节的指针,实际的数据都存放在off page中

行溢出总结:

1.行记录长度大约超过page一半时,依次将最长的列拆分发到多个page存储,直到不再超过page的一半为止;

2.溢出的列放在一个page中不够的话,继续放在新的page中

3.compact格式下,溢出的列只存储前768字节

4.dynamic格式下,溢出的列只存储前20字节(指针)

5.select * 会同时读取这些溢出的列,代价很高

6.执行计划中出现filesort或temporary table时,一般都无法放在内存中,需要变成disk tmp table,IO代价更高。

dynamic,将长字段完全off-page存储

compressed(存储的行数据会以zlib算法进行压缩)将data、index、pages进行压缩,但buffer pool中的pages则不压缩

CHAR行结构存储

char(N)中N是指字符的长度,所以在不同的字符集下,char类型列内部存储的可能不是定长的数据。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值