被动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(单位页)运行一次同步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<ibuf->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));

}

……

innodb之change buffer被动merge的更多相关文章

  1. MySQL -- Innodb中的change buffer

    change buffer是一种特殊的数据结构,当要修改的辅助索引页不在buffer pool中时,用来cache对辅助索引页的修改.对辅助索引页的操作可能是insert.update和delete操 ...

  2. 全网最清楚的:MySQL的insert buffer和change buffer 串讲

    目录 一.前言 二.问题引入 2.1.聚簇索引 2.2.普通索引 三.change buffer存在的意义 四.再看change buffer 五.change buffer 的限制 六.change ...

  3. mysql小特性:change buffer

    change buffer是在其他数据库中没有的一个概念,说白了就是一块系统表空间分配的空间,针对的对象是辅助索引的叶子节点(为什么不是主键索引?因为主键索引是聚集索引,在磁盘上的排列是有序的,磁盘的 ...

  4. InnoDB关键特性之change buffer

    一.关于IOT:索引组织表 表在存储的时候按照主键排序进行存储,同时在主键上建立一棵树,这样就形成了一个索引组织表,一个表的存储方式以索引的方式来组织存储的. 所以,MySQL表一定要加上主键,通过主 ...

  5. insert buffer/change buffer double write buffer,双写 adaptive hash index(AHI) innodb的crash recovery innodb重要参数 innodb监控

    https://yq.aliyun.com/articles/41000 http://blog.itpub.net/22664653/viewspace-1163838/ http://www.cn ...

  6. Mysql InnoDB三大特性-- change buffer

    Mysql InnoDB三大特性-- change buffer

  7. mysql-5.7 innodb change buffer 详解

    一.innodb change buffer 介绍: 1.innodb change buffer 是针对oltp场景下磁盘IO的一种优化(我也感觉这个不太像人话,但是它又非常的准确的说明 innod ...

  8. Innodb Change Buffer

    Change Buffer属于Innodb内存中的一块结构,它主要用来缓存对二级索引数据的修改(insert, update, delete)操作当二级索引不在Buffer pool中的时候,这些写操 ...

  9. MySQL:change buffer

    1. 概念 Innodb维护了一个缓存区域叫做Buffer Pool,用来缓存数据和索引在内存中.其大小通过参数 innodb_buffer_pool_size 控制: change buffer 是 ...

随机推荐

  1. MAC抓包工具charles(青花瓷)

    下载链接:http://pan.baidu.com/s/1pL6ClBX 配置教程:http://blog.csdn.net/jiangwei0910410003/article/details/41 ...

  2. 编译静态库tinyxml2

    tinyxml的makefile文件默认是编译可执行的二进制文件xmltest.  需要改成静态库. 更改OUTPUT := xmltest 为:OUTPUT := libtinyxml.a 删除SR ...

  3. HDU 5687 Problem C(Trie+坑)

    Problem C Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Tota ...

  4. 无序字母对 character

    无序字母对 character 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入 ...

  5. Django使用js,css等静态文件的时候,出现mime类型问题

    使用adminLTE模板, return render(request, 'AdminLTE/index.html') 的时候报如下错误且页面渲染异常,css没有效果: Resource interp ...

  6. node系列

    http://www.cnblogs.com/zhongweiv/p/nodejs.html

  7. cf 613E - Puzzle Lover

    Description 一个\(2*n\)的方格矩阵,每个格子里有一个字符 给定一个长度为\(m\)的字符串\(s\) 求在方格矩阵中,有多少种走法能走出字符串\(s\) 一种合法的走法定义为:从任意 ...

  8. 【HDOJ5517】Triple(二维BIT)

    题意:给你n个二元组<a,b>, m个三元组<c,d,e>. 如果d = e,那么<a,c,d>会组成一个新的三元组集合G. 问G中有多少个三元组在凸点.(没有其它 ...

  9. 【CF778C】Peterson Polyglot(Trie树,启发式合并)

    题意:有一棵n个结点的只由小写字母组成的Trie树,给定它的具体形态,问删除哪一层后剩下Trie树的结点数最少 n<=3e5 思路:先建出原Trie树,对于每一层的每一个结点计算删除后对答案的贡 ...

  10. CODEVS【1380】没有上司的舞会

    题目描述 Description Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职员有一个快乐指数.现在有个周年庆宴会 ...