被动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. 一些echarts的基本图形

    先拿一个图形渲染过程举例 引用处 <bar ref="ARPUChart" v-if="ARPUChart" style="width:500p ...

  2. JavaWeb开发小结

    JavaWeb开发是B/S开发的一种,其他语言也可以实现,就前台而言,一直都是HTML.CSS.JavaScript 后台语言可以是Perl.Python.PHP.Java等等 Java机缘巧合在We ...

  3. HDFS设计思想

    HDFS设计思想 DataNode:用来在磁盘上存储数据 HDFS  数据存储单元( block ) 1 文件被切分成固定大小的数据block块 •默认数据块大小为 64MB(hadoop1.x版本6 ...

  4. 洛谷P3245 [HNOI2016]大数 【莫队】

    题目 题解 除了\(5\)和\(2\) 后缀数字对\(P\)取模意义下,两个位置相减如果为\(0\),那么对应子串即为\(P\)的倍数 只用对区间种相同数个数\(x\)贡献\({x \choose 2 ...

  5. HTML 对空行和空格进行控制

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. pat 团体天梯赛 L3-009. 长城

    L3-009. 长城 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 邓俊辉(清华大学) 正如我们所知,中国古代长城的建造是为了抵御外 ...

  7. 洛谷 [P4301] 新Nim游戏

    线性基 +博弈论 先手必胜当且仅当先手取完之后留下的序列无论如何组合,异或和都不为 0 也就是剩下的整数线性无关,所以我们对所有整数排序,由高往低的贪心的插入线性基, 无法插入的就有先手取出,容易发现 ...

  8. POJ3311 Hie with the Pie

    The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possible. Unfortu ...

  9. 【nginx】nginx的介绍

    Nginx 反向代理初印象 Nginx (“engine x”) 是一个高性能的HTTP和反向代理 服务器,也是一个IMAP/POP3/SMTP服务器.其特点是占有内存少,并发能力强,事实上nginx ...

  10. poj 2280 Islands and Bridges 哈密尔顿路 状压dp

    题目链接 题意 给定一个\(N\)个点的无向图,求一条哈密尔顿路径\(C_1C_2...C_n\),使其\(value\)最大. \(value\)的计算方式如下:\[\begin{aligned}v ...