WEB开发网
开发学院数据库MySQL MySQL内核:innodb动态数组内部实现 阅读

MySQL内核:innodb动态数组内部实现

 2008-12-03 11:15:15 来源:WEB开发网   
核心提示: 图1表示的是只有一个节点时的情况,当节点分裂时的变化,MySQL内核:innodb动态数组内部实现(4),见图2,通过图2,那么就会申请一个新的block,这里我们就可以明白了,并集合前面的代码,我们可以发现

图1表示的是只有一个节点时的情况,当节点分裂时的变化,见图2。

MySQL内核:innodb动态数组内部实现

通过图2,并集合前面的代码,我们可以发现,从第一个节点,变为两个节点的时候,首节点先把自己挂到base链表中,并分配一个新的节点,挂在base的最后一个节点。链表中的节点通过list进行互连。同样,如果还需要再增加一个节点,那么就在base链表的结尾再增加一个。因为是新增节点,所以设置该节点的used值为0。

我们在关注一下这一行代码:

block->used = block->used | DYN_BLOCK_FULL_FLAG;

从这一行代码,我们可以猜想一下该行代码的含义:

a) FULL表明该节点已经完全使用完,不可以再使用其中的空间。所以,链表只有最后一个节点才是可以使用的。每增加一个节点,总要设置前面一个节点的DYN_BLOCK_FULL_FLAG。

b) 每个块,data数组的预设值是DYN_ARRAY_DATA_SIZE(值为512),

#define DYN_BLOCK_FULL_FLAG 0x1000000UL

所以,use的值小于等于512,那么该节点为尾节点。因为非尾节点的值肯定大于512,它与DYN_BLOCK_FULL_FLAG进行了或操作。

2)used

used表示data[DYN_ARRAY_DATA_SIZE]字段中已经使用的字节的数量,假设需要申请len字节的长度,在使用之前需要判断的是,尾 block中的可用空间是否够用。也就是判断判断下used+len是否满足used+len<= DYN_ARRAY_DATA_SIZE,如果满足就可以放进该block,并将已使用的字节数used加上len。

如果,该block空间不够,那么就会申请一个新的block,这里我们就可以明白了,为什么需要满足len的长度小于等于DYN_ARRAY_DATA_SIZE。

上一页  1 2 3 4 5 6 7 8  下一页

Tags:MySQL 内核 innodb

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接