全部博文(2759)
分类: Mysql/postgreSQL
2013-07-13 05:54:40
原文地址:innodb compact记录格式初体验 作者:invincibleliu
compact行记录格式是在mysql5.0以后引入的,目的是为了高效存放数据,其记录按如下方式存放
变长字段长度列表是一个int数组,逆序排列,数组元素或为长度个或为1字节或为2字节,取决于varchar的长度,这也就是为什么定义varchar不能超过65535的原因(2^16-1=65535);NULL标志位是一个bitMap,标记那些为null的字段;记录头长度为5字节;接下来是三个隐藏字段,rowid长度为6字节,当且仅当用户没有定义primary key时才会出现,transid是创建这条记录的事务的id,为6字节,回滚指针指向innodb回滚段,为7字节,剩下的列数据跟用户建表时定义的一一对应
下面通过一个实例来说明上述字段:
mysql实例用如下配置启动
点击(此处)折叠或打开
点击(此处)折叠或打开
window用户使用ultraedit打开test.ibd,linux用户输入命令
点击(此处)折叠或打开
翻到第0000c070行
点击(此处)折叠或打开
从offset
0000c078开始就是我们的compact记录
首先是变长字段长度列表(这里出了点状况,我厂的mysql居然把定长的char也放到变长字段长度列表里面来了),3是第一行记录'ccc'的长度,10是'bb'的长度,1是'a'的长度,注意是逆序的哦;
bitmap 00说明该行记录没有null的字段
记录头注意最后两个字节:00 29,这是指向下一条记录的相对offset;算导里讲B+树时曾经提到过数据库页块内使用二分法查找可以提高效率,但是请注意这里不再适用了,老老实实用这个相对偏移量吧:)
有兴趣的读者可以对剩下两行进行类似的分析,顺便感受一下compact的吝啬