innodb之change buffer被动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(单位页)运行一次同步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的更多相关文章
- MySQL -- Innodb中的change buffer
change buffer是一种特殊的数据结构,当要修改的辅助索引页不在buffer pool中时,用来cache对辅助索引页的修改.对辅助索引页的操作可能是insert.update和delete操 ...
- 全网最清楚的:MySQL的insert buffer和change buffer 串讲
目录 一.前言 二.问题引入 2.1.聚簇索引 2.2.普通索引 三.change buffer存在的意义 四.再看change buffer 五.change buffer 的限制 六.change ...
- mysql小特性:change buffer
change buffer是在其他数据库中没有的一个概念,说白了就是一块系统表空间分配的空间,针对的对象是辅助索引的叶子节点(为什么不是主键索引?因为主键索引是聚集索引,在磁盘上的排列是有序的,磁盘的 ...
- InnoDB关键特性之change buffer
一.关于IOT:索引组织表 表在存储的时候按照主键排序进行存储,同时在主键上建立一棵树,这样就形成了一个索引组织表,一个表的存储方式以索引的方式来组织存储的. 所以,MySQL表一定要加上主键,通过主 ...
- 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 ...
- Mysql InnoDB三大特性-- change buffer
Mysql InnoDB三大特性-- change buffer
- mysql-5.7 innodb change buffer 详解
一.innodb change buffer 介绍: 1.innodb change buffer 是针对oltp场景下磁盘IO的一种优化(我也感觉这个不太像人话,但是它又非常的准确的说明 innod ...
- Innodb Change Buffer
Change Buffer属于Innodb内存中的一块结构,它主要用来缓存对二级索引数据的修改(insert, update, delete)操作当二级索引不在Buffer pool中的时候,这些写操 ...
- MySQL:change buffer
1. 概念 Innodb维护了一个缓存区域叫做Buffer Pool,用来缓存数据和索引在内存中.其大小通过参数 innodb_buffer_pool_size 控制: change buffer 是 ...
随机推荐
- Start state is missing. Add at least one state to the flow
springmvc配置过程中,会配置数据库文件,比如说如下文件:这个时候可能会出现“Start state is missing. Add at least one state to the flow ...
- Markdown语法图解
Markdown语法图解 文章目录 快捷键 基本语法 对字体设置斜体.粗体.删除线 分级标题 链接 分割线 代码块 引用 列表 表格 常用技巧 换行 缩进字符 如何打出一些特殊符号 字体.字号与颜色 ...
- NBUT 1618 投放炸弹(树状数组)
[1618] 投放炸弹 时间限制: 1000 ms 内存限制: 65535 K 问题描述 我们定义一个炸弹能炸毁的地方要求曼哈顿距离小于等于某个值. 曼哈顿距离——两点在南北方向上的距离加上在东西方向 ...
- MySQL的InnoDB的细粒度行锁,是它最吸引人的特性之一。
MySQL的InnoDB的细粒度行锁,是它最吸引人的特性之一. 但是,如<InnoDB,5项最佳实践>所述,如果查询没有命中索引,也将退化为表锁. InnoDB的细粒度锁,是实现在索引记录 ...
- Gym 100971B 水&愚
Description standard input/output Announcement Statements A permutation of n numbers is a sequence ...
- 零基础学习Mahout之-----搭建单机环境
一.Mahout是什么? Mahout是Apache的一个开源项目(http://mahout.apache.org/),提供了机器学习领域的若干经典算法,以便开发人员快速构建机器学习和数据挖掘方面的 ...
- xCode控制台的使用-应用闪退原因跟踪
xCode控制台的使用-应用闪退原因跟踪 今天遇到这个一个问题,使用xCode version = 5.0 编译一个程序,刷到IOS7设备后,应用运行正常,但是刷新到IOS<7,打开饮用后就会出 ...
- Bluedroid之GKI
1. 概述 GKI以库libbt-brcm_gki.a的形式提供给Bluedroid使用 该层是一个适配层,适配了OS相关的进程.内存相关的管理,还可以用于线程间传递消息 主要通过变量gki_cb(结 ...
- android基本控件学习-----SeekBar&RatingBar
SeekBar(拖动条)和RatingBar(星级评分条)讲解 一.SeekBar(拖动条) (1)拖动条简单理解就是可以拖动的线,这个对我们来讲很常见,比如视频播放或者音乐播放我们拖动播放的进度,下 ...
- Android启动过程深入解析【转】
转自:http://www.open-open.com/lib/view/open1403250347934.html 当按下Android设备电源键时究竟发生了什么? Android的启动过程是怎么 ...