mysql-innodb行记录格式
行记录格式
为织金等地区用户提供了全套网页设计制作服务,及织金网站建设行业解决方案。主营业务为网站建设、做网站、织金网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
可以通过show table status like 'table_name'命令查看当前表使用的行格式(row_format字段)
row_format
redundant,最早的行格式
记录头信息:占用6字节,含义如图:
最后部分即为实际存储的每个列的数据
注意:对于varchar类型的NULL值,不占用任何存储空间,而char类型的NULL值需要占用空间
compact,5.0.3以后默认行格式
首部是一个非NULL变长字段长度列表,且按照列的顺序逆序放置,其长度为(若列的长度小于255字节,用1字节表示;若大于255个字节,用2字节表示)
NULL标志位:该行数据是否有NULL值,有则用1表示,占用1个字节
记录头信息:固定占用5字节,含义如图:
最后的部分为实际存储每个列的数据(注: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的行溢出数据存储格式如图:
varchar(N)中N指的是字符的长度,而文档说明中varchar类型最大支持65535单位是字节且指的是所有varchar列的长度总和。
dynamic和compressed存放在BLOB中的数据采用的行溢出方式如图:
行溢出总结:
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类型列内部存储的可能不是定长的数据。
分享标题:mysql-innodb行记录格式
本文地址:http://ybzwz.com/article/ghjhjs.html