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/t1G
二、各个行格式的物理结构 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
