)执行一次同步ibuf merge(ibuf_contract),merge的page no是随机定位的记录的page no,最多一次merge 8页,同时放弃本次缓存
2、 其中ibuf_max_size=25%*bufferpool size,百分比由innodb_change_buffer_max_size控制,可动态调整。
…
if (ibuf->size >= ibuf->max_size +IBUF_CONTRACT_DO_NOT_INSERT) {
/*Insert buffer is now too big, contract it but do not try to insert */
/* Use synchronous contract (== TRUE) */
ibuf_contract(TRUE);
return(ibuf_merge(0, &n_pages, sync));
return(ibuf_merge_pages(n_pages,sync));
return(DB_STRONG_FAIL);
}
?
被动merge情景三,insert 操作可能产生ibuf btree分裂:ibuf0ibuf.cc:: ibuf_insert_low
说明:
1、 当ibuf->size
max_size时(IBUF_CONTRACT_ON_INSERT_NON_SYNC=0)不做任何操作
2、 当ibuf->size>= ibuf->max_size+5时,ibuf_contract(true),同步一次ibuf merge,位置随机
3、 当ibuf->max_size< ibuf->size <= ibuf->max_size+5时,ibuf_contract(false),异步merge,位置随机。
4、 Merge至少8页,ut_min(IBUF_MAX_N_PAGES_MERGED, buf_pool_get_curr_size() / 4);
……
if (err == DB_SUCCESS && mode ==BTR_MODIFY_TREE) {
ibuf_contract_after_insert(entry_size);
if (size < max_size +IBUF_CONTRACT_ON_INSERT_NON_SYNC) {
return;
}
sync = (size >= max_size +IBUF_CONTRACT_ON_INSERT_SYNC);
size = ibuf_contract(sync);
return(ibuf_merge(0,&n_pages, sync));
return(ibuf_merge_pages(n_pages,sync));
}
……
?