Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6320349
  • 博文数量: 2759
  • 博客积分: 1021
  • 博客等级: 中士
  • 技术积分: 4091
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-11 14:14
文章分类

全部博文(2759)

文章存档

2019年(1)

2017年(84)

2016年(196)

2015年(204)

2014年(636)

2013年(1176)

2012年(463)

分类: Mysql/postgreSQL

2013-07-13 05:54:40

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实例用如下配置启动

点击(此处)折叠或打开

  1. [mysqld]
  2. innodb_file_per_table
建表


点击(此处)折叠或打开

  1. mysql> create table test(t1 varchar(10),t2 char(10),t3 varchar(10))engine=innodb,charset=utf8,row_format=compact;
  2. Query OK, 0 rows affected (0.04 sec)
  3. mysql> insert into test values('a','bb','ccc'),(null,'bb','cccc'),('aa','bb',null);
  4. Query OK, 3 rows affected (0.00 sec)
  5. Records: 3 Duplicates: 0 Warnings: 0


window用户使用ultraedit打开test.ibd,linux用户输入命令

点击(此处)折叠或打开

  1. hexdump -Cv test.ibd > test.txt

翻到第0000c070


解析如下

点击(此处)折叠或打开

  1. 03 0a 01              /*长度列表,逆序*/
  2. 00                      /*bit map*/
  3. 00 00 10 00 29          /*记录头*/
  4. 00 00 00 00 e4 09      /*rowid*/
  5. 00 00 00 05 f6 6a          /*trans id*/
  6. 80 00 00 36 90 01 10      /*指向回滚段的指针*/
  7. 61                          /*a*/
  8. 62 62 20 20 20 20 20 20 20 20    /*bb 多余的用20填充*/
  9. 63 63 63                          /*ccc*/


offset 0000c078开始就是我们的compact记录
首先是变长字段长度列表(这里出了点状况,我厂的mysql居然把定长的char也放到变长字段长度列表里面来了),3是第一行记录'ccc'的长度,10'bb'的长度,1'a'的长度,注意是逆序的哦;

bitmap 00说明该行记录没有null的字段

记录头注意最后两个字节:00 29,这是指向下一条记录的相对offset;算导里讲B+树时曾经提到过数据库页块内使用二分法查找可以提高效率,但是请注意这里不再适用了,老老实实用这个相对偏移量吧:)

有兴趣的读者可以对剩下两行进行类似的分析,顺便感受一下compact的吝啬

阅读(468) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~