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

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

 2008-12-03 11:15:15 来源:WEB开发网   
核心提示: 那么如果是只有一个节点,那么很容易理解,MySQL内核:innodb动态数组内部实现(6),假设链表是多个节点,这里面的used肯定是大于DYN_ARRAY_DATA_SIZE,分配一个元素,然后进行赋值,因为每次生成一个block,就会调用dyn_array_add_block函数

那么如果是只有一个节点,那么很容易理解。假设链表是多个节点,这里面的used肯定是大于DYN_ARRAY_DATA_SIZE。因为每次生成一个block,就会调用dyn_array_add_block函数,在该函数中,会将前一个block的used进行置位操作。

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

所以,当arr存在多个block的时候,首节点的条件“used + size > DYN_ARRAY_DATA_SIZE”必为真。这时候,我们就去获取尾节点。

  block = dyn_array_get_last_block(arr);
used = block->used;
  if (used + size > DYN_ARRAY_DATA_SIZE) {
 block = dyn_array_add_block(arr);
 used = block->used;
}

尾节点的used肯定没有进行过置位操作。然后判断是否需要新增block节点。

回过头来,函数dyn_array_push的返回值,是一个指针,指向新增加元素的指针,然后用户对该指针进行操作赋值。我们来看下,系统中的一个使用实例。

  /*******************************************************
Pushes an object to an mtr memo stack. */
UNIV_INLINE
void
mtr_memo_push(
/*==========*/
mtr_t*mtr,/* in: mtr */
void*object,/* in: object */
ulinttype)/* in: object type: MTR_MEMO_S_LOCK, ... */
{
dyn_array_t* memo;
mtr_memo_slot_t*slot;
  ut_ad(object);
ut_ad(type >= MTR_MEMO_PAGE_S_FIX);
ut_ad(type <= MTR_MEMO_X_LOCK);
ut_ad(mtr);
ut_ad(mtr->magic_n == MTR_MAGIC_N);
  memo = &(mtr->memo);
  //分配大小为sizeof(mtr_memo_slot_t)的动态数组空间
slot = dyn_array_push(memo, sizeof(mtr_memo_slot_t));
  slot->object = object; //对返回的指针进行操作
slot->type = type;   //对返回的指针进行操作
}

通过上文的描述,我们可以使用dyn进行操作。分配一个元素,然后进行赋值。那么我们再思考下,有没有优化的可能?

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

Tags:MySQL 内核 innodb

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