InnoDB Insert Buffer(插入缓冲)

每个存储存储引擎自身都有自己的特性(决定性能以及更高可靠性),而InnoDB的关键特性有:

  • 插入缓冲(Insert Buffer)--》Change Buffer
  • 两次写(Double Write)
  • 自适应哈希索引(Adaptive Hash Page)
  • 异步IO(Async IO)
  • 刷新邻接页(Flush Neighbor Page)

今天主要聊一下插入缓冲(Insert Buffer)在InnoDB存储引擎中的作用。

Insert Buffer其实是一种重要的数据变更日志,在MySQL5.1 之前称为Insert Buffer, 优化2级非唯一索引上插入操作的读IO,在MySQL5.5之后改名为Change Buffer, 功能也扩展为2级非唯一索引上的插入、删除、更新、purge的读IO优化。也就是说Change buffer的主要目的是将对二级索引的数据操作缓存下来,以此减少二级索引的随机IO,并达到操作合并的效果。值得提的一点是,Change Buffer也是物理页的组成部分。

Change Buffer的核心思想,当数据库需要对2级缓存进行修改时,是将这些更新缓存在内存中,在特定的条件下,统一将这些更新到相应的2级索引页上,这样做可以减少读IO的次数,并且相邻的页的读IO可以合并。之所以无法对主键和唯一索引进行优化是因为唯一性判断需要读取实际索引页面中的数据,这就和Insert Buffer 减少读 IO 的初衷背离了。在源码中的命名一直还是用ibuf。
 
struct ibuf_struct{
  ulint size; //当前ibuf btree 页面数
  ulint max_size; //ibuf最大页面数
  ulint seg_size; //所属段的页面数
  ibool empty; //是否为空
  ulint free_list_len; //空闲链表长度
  ulint height; //树高度
  dict_index_t* index; //ibuf索引   ulint n_merges; //合并的页面数
  ulint n_merged_ops[IBUF_OP_COUNT]; //各种操作合并的页面数
  ulint n_discarded_ops[IBUF_OP_COUNT]; //放弃的操作涉及的页面数
};

从上述的结构体可以得知,Ibuf实际上也是一棵B+树索引,它与innodb中其他的b+树有着完全一样的结构。Ibuf树中的记录其实就是包含了记录本身,还有记录所在页面号的信息。

  值得注意的点是,ibuf只适用于 non-unique secondary indexes 也就是说只能用在非唯一的索引上,原因如下:

1. primary key 是按照递增的顺序进行插入的,异常插入聚族索引一般也顺序的,非随机IO

2. 写唯一索引要检查记录是不是存在,所以在修改唯一索引之前,必须把修改的记录相关的索引页读出来才知道是不是唯一、这样ibuf就没意义了,要读出来(随机IO)所以只对非唯一索引有意义。

ibuf可以对三种类型的操作进行缓存:INSERT、DELETE-MARK 、DELETE操作,前两种对应用户线程操作,第三种则由purge操作触发。

用户可以通过参数innodb_change_buffering来控制缓存何种操作:

static const char* innobase_change_buffering_values[IBUF_USE_COUNT] = {
"none", /* IBUF_USE_NONE */
"inserts", /* IBUF_USE_INSERT */
"deletes", /* IBUF_USE_DELETE_MARK */
"changes", /* IBUF_USE_INSERT_DELETE_MARK */
"purges", /* IBUF_USE_DELETE */
"all" /* IBUF_USE_ALL */
};

ibuf默认值为all,表示缓存所有操作。注意由于在二级索引上的更新操作总是先delete-mark,再insert新记录,因此update会产生两条ibuf entry。

因此delete buffer对应update操作的第一个过程,即将记录标记为删除。purge buffer对应update操作的第二个过程,即将记录真正的删除。同时InnoDB存储引擎提供了参数innodb_change_buffering,用来开启各种buffer选项。该参数的可选值为:inserts、deletes、purges、changes、all、none。inserts、deletes、purges就是前面讨论过的三种情况。changes表示启用inserts和deletes,all表示启用所有,none表示都不启用。

InnoDB Insert Buffer(插入缓冲)的更多相关文章

  1. innodb insert buffer 插入缓冲区的理解

    今天在做一个大业务的数据删除时,看到下面的性能曲线图 在删除动作开始之后,insert buffer 大小增加到140.对于这些状态参数的说明 InnoDB Insert Buffer 插入缓冲,并不 ...

  2. InnoDB Insert Buffer(插入缓冲 转)

    一,插入缓冲(Insert Buffer/Change Buffer):提升插入性能 只对于非聚集索引(非唯一)的插入和更新有效,对于每一次的插入不是写到索引页中,而是先判断插入的非聚集索引页是否在缓 ...

  3. INNODB insert buffer 简单分析

    在mysql5.1 之前称为Insert Buffer, 优化2级非唯一索引上插入操作的读IO, 在5.5之后改名为Change Buffer, 功能也扩展为2级非唯一索引上的插入.删除.更新.pur ...

  4. InnoDB Insert(插入)操作(下)--mysql技术内幕

    接上一篇文章,最后做的那个实验,我是想证明mysql innodb存储引擎,commit操作与flush数据到磁盘之间的关系,当与同事交流之后,他说,你应该把innodb_buffer_size的大小 ...

  5. InnoDB关键特性之insert buffer

    insert buffer 是InnoDB存储引擎所独有的功能.通过insert buffer,InnoDB存储引擎可以大幅度提高数据库中非唯一辅助索引的插入性能. 数据库对于自增主键值的插入是顺序的 ...

  6. innodb 关键特性(insert buffer)

    一.insert buffer 性能改善 insert buffer和数据页一样,也是物理页的一个组成部分. 在innodb存储引擎中,主键是行唯一的标识符.通常应用程序中行记录的插入顺序是按照主键递 ...

  7. 【mysql】Innodb三大特性之insert buffer

    一.什么是insert buffer insert buffer是一种特殊的数据结构(B+ tree)并不是缓存的一部分,而是物理页,当受影响的索引页不在buffer pool时缓存 secondar ...

  8. 重要,知识点:InnoDB的插入缓冲

    世界上最快的捷径,就是脚踏实地,本文已收录[架构技术专栏]关注这个喜欢分享的地方. InnoDB引擎有几个重点特性,为其带来了更好的性能和可靠性: 插入缓冲(Insert Buffer) 两次写(Do ...

  9. 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 ...

随机推荐

  1. 十四、new Comparator<T>实现多重排序结果

    1.编写实现类 package com.abcd; public class Person{ private String name; private int age; private int sal ...

  2. linux内存黑洞

    1.问题 k8s集群中node节点的内存使用率居高不下,使用率达到90%多.通过以下命令可以发现此虚拟机分配的内存为15g,但是用户进程使用的内存总共为7个多g,并且slab和pageTables使用 ...

  3. 20172306 2018-2019-2 《Java程序设计与数据结构》第九周学习总结

    20172306 2018-2019-2 <Java程序设计与数据结构>第九周学习总结 教材学习内容总结 无向图 图是由结点和这些结点之间的连接构成 就图来说,结点叫做顶点,结点之间的连接 ...

  4. python爬虫-上期所持仓排名数据爬取

    摘要:笔记记录爬取上期所持仓数据的过程,本次爬取使用的工具是python,使用的IDE是pycharm 一.查看网页属性,分析数据结构 在浏览器中打开上期所网页,按F12或者选择表格文字-右键-审查元 ...

  5. xbee3的先进性功能用法

    xbee3以及xbee3 PRO 是digi无线模块的又一大突破:不仅实现了所有2.4G的模块整合,更在以后的程序更新中会增加蓝牙功能:它打通了xbee系列1和系列2之间的壁垒:不同于xbee S2C ...

  6. JavaScript 平时记录

    1,JS中的this 见下面例子,注意函数中的函数 中的this指的是window对象了!!! document.addEventListener('click', function (e) { co ...

  7. [Java练习题] -- 1. 使用java打印杨辉三角

    package cn.fzm.demo1.array; import java.util.Scanner; /* * 需求:打印杨辉三角形(行数可以键盘录入) 1 1 1 1 2 1 1 3 3 1 ...

  8. fiddler抓包工具总结

    Fiddler 抓包工具总结 Fiddler是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获.重发.编辑.转存等操作.也可以用来检测网络安全.反正好处多多,举之不尽呀!当年学习的时候也 ...

  9. Redis sentinel之集群搭建

    环境 由于不太熟悉docker,所以,把docker当虚拟机来用,服务器环境如下: Redis Server 环境搭建 Redis Server 01 搭建 并且制作Redis镜像 容器建立 # do ...

  10. virtualenv搭建

    1.准备工作 终端 网络状况良好 2.安装虚拟环境 ​ 如何安装虚拟环境: ​ 2.1了解你的电脑中有哪些版本的python whereis python 查看当前系统中有多少跟python有关的命令 ...