对应的文件为: D:/mysql-5.1.7-beta/storage/innobase/rem/rem0rec.c D:/mysql-5.1.7-beta/storage/innobase/include/rem0rec.h D:/mysql-5.1.7-beta/storage/innobase/include/rem0rec.ic 1)innodb旧式结构组成 Bingxi:“alex,mysql存储的最基本的结构是记录。B树的内结点和叶结点都是由记录组成。实际存储的内容如下: 内容1:存放字段偏移量,用于指明字段的偏移量。长度为字段数*1或者字段数*2 内容2:长度为6,存放记录的控制信息。 内容3:存放实际的内容(记录指针指向内容3的开始处)。 Alex,你在代码中看下控制信息相关的6个字节的定义。” Alex:“好的,我们看下rem0rec.ic的中旧式记录的控制结构的定义。 因此,我们继续看代码,假设我们已经得到一个记录指针p,那么我们如何获得对应的控制信息。 从指针向前数出6个字节,这六个字节是00 00 10 13 00 ce 根据前面的推算,可以得知如下信息: 我们接着往下看字段偏移量的类型,在这6个控制信息之前存放的是字段偏移量,也就是相对于记录指针的偏移量。 我们继续进行调试,在rec_1_get_field_start_offs函数设置断点,可以看到rec的值为0x011ac122。 根据控制信息可以知道该记录的字段数为10个。这10个偏移量:34 b0 30 2c 24 20 1c 14 0d 07 这些偏移量是反向存储的,实际上对应的各字段的长度为: 当偏移量是1字节时,最高位为0,则是非NULL,为1,则该字段是null。其他的7bit用于表示偏移量,因此可以表示的最大偏移量为127。 当偏移量为2字节时,最高位为0,则是非null,为1,则该字段是null,次最高位用于表示是否字段存储在同一页。 经过重组,本例的记录进行梳理如下: Bingxi:“默认情况下,5.1.7版本中,数据字典使用还是旧式记录,而用户自己创建的innodb表使用的是新式存储结构。在下一篇里,我们聊下新式记录格式。” Alex:“ok” 转载请保留固定链接: https://linuxeye.com/database/385.html |