设为首页 加入收藏

TOP

innodb之changebuffer被动merge(一)
2015-11-21 01:59:48 来源: 作者: 【 】 浏览:2
Tags:innodb changebuffer 被动 merge

被动merge情景一,二级索引页空间不足:ibuf0ibuf.cc:: ibuf_insert_low

1、当尝试缓存插入操作时,如果预估二级索引page的空间不足,可能导致索引分裂,则定位到尝试缓存的page no在ibuf tree中的位置,最多merge 8个page,merge方式为异步,即发起异步读取索引页请求。

说明:

Buffered:当前二级索引页已经缓存的记录

entry_size:待插入的二级索引记录大小

page_dir_calc_reserved_space(1):待插入记录的slot大小

ibuf_index_page_calc_free_from_bits(zip_size,bits)):待插入二级索引页面剩余空间大小

…

/* Find out the volume of already bufferedinserts for the same index page */

min_n_recs= 0;

buffered= ibuf_get_volume_buffered(&pcur, space, page_no,

op == IBUF_OP_DELETE

? &min_n_recs

: NULL, &mtr);

……

do_merge = FALSE;

……

//打开待插入ibuf记录在ibuf tree中的前一个记录位置

btr_pcur_open(ibuf->index, ibuf_entry,PAGE_CUR_LE, mode, &pcur, &mtr);

……

if (op == IBUF_OP_INSERT){

ulint bits = ibuf_bitmap_page_get_bits(

bitmap_page,page_no, zip_size, IBUF_BITMAP_FREE,&bitmap_mtr);

if(buffered + entry_size + page_dir_calc_reserved_space(1)

>ibuf_index_page_calc_free_from_bits(zip_size, bits)) {

…

do_merge= TRUE;

ibuf_get_merge_page_nos(FALSE,

btr_pcur_get_rec(&pcur),&mtr,

space_ids,space_versions,

page_nos,&n_stored);

……

}

}

……

if(do_merge) {

buf_read_ibuf_merge_pages(false, space_ids,space_versions,

page_nos, n_stored);

}

?

?

?

问题:

1、buffered指什么?page_dir_calc_reserved_space(1)是什么?

指二级索引页插入二级索引时,已经缓存的记录的个数。当插入二级索引时,如果二级索引页发生分裂,ibuf树种记录的页面信息就会部分时效。因此每次插入时需要对bitmap进行判断。

2、如何判读merge了8页?

IBUF_MAX_N_PAGES_MERGED值是8.

Merge页的个数是8和当前buffer pool大小的1/4最小值

Ibuf0ibuf.cc::ibuf_get_merge_page_nos_func

limit = ut_min(IBUF_MAX_N_PAGES_MERGED, buf_pool_get_curr_size() / 4);

while (*n_stored < limit) {

……

page_nos[*n_stored] = prev_page_no;

……

}

3、merge的哪8个页?

递增的8个页。。。,这8个页指的是索引页,还是ibuftree的页?

首先定位到待插入记录的前一个记录的位置,根据前一个记录依次向前推8个记录。这8个记录里的space id和page no就是需要被merge的二级索引页的标记。

1、buf0rea.cc::buf_read_ibuf_merge_pages

输入参数:

Bool Sync:true if the caller wantsthis function to wait for the highest address page to get read in, before this functionreturns

const ulint* space_ids:space id数组

const ib_int64_t* space_versions:the spaces musthave this version number (timestamp), otherwise we discard the read; we usethis to cancel reads if DISCARD + IMPORT may have changed the tablespace size

const ulint* page_nos:读入的页号数组

ulint n_stored:页号数组元素个数

说明:

将数组页读入内存,merge相关页

Issues read requests for pages which theibuf module wants to read in, in order to contract the insert buffer tree.Technically, this function is like a read-ahead function

for (i = 0; i < n_stored; i++) {

……

buf_read_page_low(&err, sync && (i + 1 == n_stored),

BUF_READ_ANY_PAGE, space_ids[i],

zip_size, TRUE,space_versions[i],

page_nos[i]);

if (sync) {

/* The i/o is already completed when wearrive from fil_read */

if (!buf_page_io_complete(bpage)) {

return(0);

}

}

……

}

Buf0buf.cc::buf_page_io_complete:异步读

…

if (io_type ==BUF_IO_READ){

…

if (uncompressed&& !recv_no_ibuf_operations) {

ibuf_merge_or_delete_for_page(

(buf_block_t*)bpage, bpage->space,

bpage->offset,buf_page_get_zip_size(bpage),

TRUE);

}

}

……

2、ibuf0ibuf.cc:: ibuf_merge_or_delete_for_page

输入参数:

block: 如果page已经从磁盘读取,指向pagex-latched

space:index page的space id

page_no:index page的页号

zip_size:compressed page大小

update_ibuf_bitmap:通常情况下设true。如果已经或者正在删除tablespace,设false

说明:

当一个二级索引页从磁盘读到buffer pool时,应用这个函数,将该页对应的所有操作merge,删除insert buffer中的entries。如果这个页没有读,但在buffer pool中创建,那么删除他缓存的操作记录。

被动merge情景二,insert buffer过大:ibuf0ibuf.cc:: ibuf_insert_low

如果insert buffer大小过大,contract insert buffer,并且放弃本次缓存。

1、 ibuf->size大于ibuf->max_size+10(单位页

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇mysql根据查询结果创建表 下一篇ORA-19815,Flashback Logs-Space ..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: