MySQL内核:innodb动态数组内部实现
2008-12-03 11:15:15 来源:WEB开发网 /*************************************************************************
Closes the buffer returned by dyn_array_open. */
UNIV_INLINE
void
dyn_array_close(
/*============*/
dyn_array_t*arr,/* in: dynamic array */
byte* ptr)/* in: buffer space from ptr up was not used */
{
dyn_block_t*block;
ut_ad(arr);
ut_ad(arr->magic_n == DYN_BLOCK_MAGIC_N);
block = dyn_array_get_last_block(arr);
ut_ad(arr->buf_end + block->data >= ptr);
block->used = ptr - block->data;
ut_ad(block->used <= DYN_ARRAY_DATA_SIZE);
#ifdef UNIV_DEBUG
arr->buf_end = 0;
#endif
}
在该函数里面通过下面的一行代码进行赋值。
block->used = ptr - block->data;
其中ptr是dyn_array_open函数返回指针并使用之后的调整值。假设dyn_array_open返回的是ptr,赋值第一个长度len1的元素后,ptr得加上len1,继续len2长度的元素,ptr加上len2,以此类推。ptr指示下一个赋元组时的指针。所以通过block->used = ptr - block->data;就能够计算出偏移量,这个偏移量就是used。
看下代码的实际应用场景。
/************************************************************
Writes 8 bytes to a file page buffered in the buffer pool.
Writes the corresponding log record to the mini-transaction log. */
void
mlog_write_dulint(
/*==============*/
byte*ptr,/* in: pointer where to write */
dulintval,/* in: value to write */
mtr_t*mtr)/* in: mini-transaction handle */
{
byte*log_ptr;
if (ptr < buf_pool->frame_zero || ptr >= buf_pool->high_end) {
fprintf(stderr,
"InnoDB: Error: trying to write to a stray memory location %pn", ptr);
ut_error;
}
ut_ad(ptr && mtr);
mach_write_to_8(ptr, val);
//分配空间
log_ptr = mlog_open(mtr, 11 + 2 + 9);
/* If no logging is requested, we may return now */
if (log_ptr == NULL) {
return;
}
log_ptr = mlog_write_initial_log_record_fast(ptr, MLOG_8BYTES,
log_ptr, mtr);
mach_write_to_2(log_ptr, ptr - buf_frame_align(ptr));
log_ptr += 2;
log_ptr += mach_dulint_write_compressed(log_ptr, val);
//重设used值
mlog_close(mtr, log_ptr);
}
动态数组的主要内容就是这些,还有一些关于获取长度、元素等的函数,建议参考源代码进行理解。
- ››MySql数据库插入式的多存储引擎机制
- ››MySQL和PDO测试对比
- ››MySQL大表中重复字段的查询效率方法
- ››MySQL中BLOB字段类型介绍
- ››mysql 数据库查询随机数量条目的效率问题及解决办...
- ››MySQL中两种索引Hash与B-Tree的区别
- ››MySql存储过程 带参数处理方式
- ››MySQL数据表在phpmyadmin中的强制修复
- ››MySQL 5 乱码问题处理办法
- ››mysql sql语法错误 1149
- ››MySQL 1040 错误 Too many connections
- ››MySQL client ran out of memory(2008)
更多精彩
赞助商链接