MySQL innodb file format以及innodb row format
一、概念
当前MySQL Innodb拥有两种文件格式:
1.旧版本的antelope,对应到两种行格式:redundant和compact
2.新版本的barracuda,对应到两种行格式:dynamic和compressed
文件格式和行格式可以通过参数设置:SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_default_row_format=dynamic;
可以通过show table status like ‘test’来查看test表的行格式,知道行格式之后也就可以对应到文件格式。
或者通过infomation_schema.innodb_sys_tables来查看某一个表的文件格式和行格式:SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME='test/t1'\G
二、各个行格式的物理结构
1.redundant
6 bytes的头部信息,用于行与行之间连续相连,以及行锁
用户定义的列
6 bytes 事务id和7bytes undo指针
如果没有指定主键,会有一个隐含的6 bytes主键列
如果是二级索引行,还会带有主键列
列指针,如果行的列总长度<128bytes,则占1 byte;如果>=128byte,则占用2 bytes
变长字段的null不占用存储空间,定长字段的null占用字段固定长度
2.compact
compact格式比redundant节省大约20%空间,但会额外消耗CPU
5 bytes 事务id和7bytes undo指针
所有的NULL值不占用空间,而是在行头以一个位指针来记录是否有null值,如0010,即第三列是null
包含1到2bytes来记录非null列长度,在存在溢出页或者列长度大于255bytes时才用2bytes,2bytes里包括非null列的长度以及溢出页的20byte指针长度
如果没有指定主键,会有一个隐含的6 bytes主键列
如果是二级索引行,还会带有主键列
3.dynamic和compressed
改进的地方是blob,text,varchar大字段是完全存储于溢出页,在行数据中只存储20bytes的溢出页指针;但是如果blob和text少于40bytes,不会存储在溢出页中。
同时索引字段长度增长至3072bytes
而在旧版行格式中,对于使用到溢出页,还是会存储列的前768bytes在行数据中;
而且索引字段长度只有767bytes
还没有评论,来说两句吧...