存储相关的代码学习。以storage/innobase/btr/目录下的源码为入口,进行相应的代码分析。
1、innobase的每个page中都存在infimum和supremum两个伪记录。用于指示该页内最小和最大的记录。在btr_get_prev_user_rec和btr_get_next_user_rec这两个函数中进行rec的移动时,都要对这两个特殊的记录进行判断。
2、page_rec_is_infimum用于判断是否为最小伪记录。在page中,伪记录的位置是固定的,通过偏移就可以判断该记录是否为伪记录
3、innodb的页大小是在编译期指定的,不是在通过生成库的时候指定。此种情况相对来说不够灵活。
4、通过记录获得记录偏移和page地址的算法(函数为page_offset)。
a)所有和磁盘进行镜像的page页的起始地址都是UNIV_PAGE_SIZE的整数倍。UNIV_PAGE_SIZE是2的整数次幂
b)通过去掉rec地址中大于等于UNIV_PAGE_SIZE的位数,获得rec所在page的偏移
c)通过清除rec地中小于UNIV_PAGE_SIZE的位数,即可得到page的地址
5、page中的slot
在page页的尾部,使用2字节整数的数组,保存记录在页内的偏移。该数组为变长数组,其长度和页内的记录数目相同,页内第一条记录放在数组的最后,页内最后一条记录放在该数组的第一位。
page_dir_get_nth_slot的nth是0-based计数的
page_dir_find_owner_slot返回的是给定的record在slot数组中的编号。此编号是0-based计数的。第一条记录的编号是0
6、在页内获取前一条记录或者后一条记录
a)在page页内,slot用于保存有记录偏移信息,该信息保存在page页的尾部。
b)通过在slot中进行搜索,找到保存rec偏移的slot,该slot的位置就是rec所在的位置
c)page_rec_get_next_low用于获取下一条记录的偏移。在mysql的rec设计中,存在一个字段用于保存下一条记录的偏移