一.insert buffer

性能改善

insert buffer和数据页一样,也是物理页的一个组成部分。

在innodb存储引擎中,主键是行唯一的标识符。通常应用程序中行记录的插入顺序是按照主键递增的顺序进行插入的。因此,插入聚集索引一般是顺序的,不需要磁盘的随机读取。但是一张表上有多个非聚集的辅助索引,在进行插入操作时,数据页的存放还是按主键进行顺序存放的,但是对于非聚集索引叶子节点的插入不再是顺序的了,这时就需要离散地访问非聚集索引页,由于随机读取的存在而导致了插入操作性能下降。

innodb存储引擎开创性的设计了insert buffer,对于非聚集索引的插入或更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入;若不在,则先放入到一个insert buffer对象中,好似欺骗,数据库这个非聚集的索引已经插到叶子节点,而实际并没有,只是存放在另一个位置,然后再以一定频率和情况进行insert buffer和辅助索引叶子节点的merge操作,这时通常能将多个插入合并到一个操作中(因为在一个索引页中),这就大大提高了对于非聚集索引插入的性能。

insert buffer的使用需要同时满足以下两个条件:

1.索引是辅助索引

2.索引不是唯一的

缺点

应用程序进行大量的插入操作,这些都设计不唯一的非聚集索引,也就是使用insert buffer,若此时mysql数据库发生了宕机,这时势必有大量的insert buffer并没有合并到实际的非聚集索引中去。因此这时恢复可能需要很长的时间,在极端情况下甚至需要几个小时

辅助索引不能是唯一的,因为在插入缓冲时,数据库并不去查找索引页来判断插入的记录的唯一性。如果去查找肯定又会有离散读取的情况发生,从而导致insert buffer失去了意义

show engine innodb status\G;

innodb 1.2.x之前

seg size 显示了当前insert buffer的大小

free list len代表了空闲列表的长度

size代表了已经合并记录页的数量

inserts代表了插入的记录数

merged recs代表了合并的插入记录数量

merges代表合并的次数,也就是实际读取页的次数。merges:merges recs大约为1:3,代表了插入缓冲降对于非聚集索引页的离散io逻辑请求大约降低了2/3

问题

在写密集的情况下,插入缓冲会占用过多的缓冲池内存(innodb_buffer_pool),默认最大可以占到1/2的缓冲池内存

change buffer(可将其视为insert buffer的升级)

insert buffer 、delete buffer 、purge buffer

对一条记录进行update操作可能分为两个过程:

1.将记录标记为已删除

2.真正将记录删除

因此delete buffer对应update操作的第一个过程,即将记录标记为删除。purge buffer对应update操作的第二个过程,即将记录真正的删除。

innodb_change_buffering:用来开启各种buffer 的选项

从innodb 1.2.x版本开始,可以通过参数innodb_change_buffer_max_size来控制change buffer最大使用的数量

内部实现

insert buffer的数据结构是一颗b+树,现在的版本中,全局只有一颗insert buffer b+树,负责对所有的表的辅助索引进行insert buffer,而这颗b+树存放在共享表空间中,默认也就是ibdata1,。因此,试图通过独立表空间ibd文件恢复表中数据时,往往会check table失败。这是因为表的辅助索引中的数据可能还在insert buffer中,所以通过ibd文件进行恢复后,还需要进行repair table操作来重建表上所有的辅助索引。

innodb 关键特性(insert buffer)的更多相关文章

  1. InnoDB关键特性之change buffer

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

  2. InnoDB关键特性学习笔记

    插入缓存 Insert Buffer Insert Buffer是InnoDB存储引擎关键特性中最令人激动与兴奋的一个功能.不过这个名字可能会让人认为插入缓冲是缓冲池中的一个组成部分.其实不然,Inn ...

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

    Mysql InnoDB三大特性-- change buffer

  4. InnoDB关键特性之insert buffer

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

  5. innodb关键特性之double write

    # 脏页刷盘的风险 两次写的原理机制 1.解决问题 2.使用场景 3.doublewrite的工作流程 4.崩溃恢复 # doublewrite的副作用 1.监控doublewrite负载 2.关闭d ...

  6. InnoDB关键特性之刷新邻接页-异步IO

    Flush neighbor page 1.工作原理 2.参数控制 AIO 1.开启异步IO 一.刷新邻接页功能 1.工作原理 当刷新一个脏页时,innodb存储引擎会检测该页所在区(extent)的 ...

  7. InnoDB关键特性之自适应hash索引

    一.索引的资源消耗分析 1.索引三大特点 1.小:只在一个到多个列建立索引 2.有序:可以快速定位终点 3.有棵树:可以定位起点,树高一般小于等于3 2.索引的资源消耗点 1.树的高度,顺序访问索引的 ...

  8. innodb 关键特性(两次写与自适应哈希索引)

    两次写: 场景: 当发生数据库宕机时,可能innodb存储引擎正在写入某个页到表中,而这个页只写了一部分,这种情况被称为部分写失效,如果发生,可以通过重做日志进行恢复,重做日志中记录的是对页的物理操作 ...

  9. Innodb关键特性之自适用Hash索引

    一.索引的资源消耗分析 1.索引三大特点 1.小:只在一个到多个列建立索引 2.有序:可以快速定位终点 3.有棵树:可以定位起点,树高一般小于等于3 2.索引的资源消耗点 1.树的高度,顺序访问索引的 ...

随机推荐

  1. 20164310Exp2后门原理与实践

    一.基础问题回答 1.例举你能想到的一个后门进入到你系统中的可能方式 答:在莫名其妙的网站下载某些莫名奇妙的播放器. 2.例举你知道的后门如何启动起来(win及linux)的方式? 答:对于windo ...

  2. MFC如何添加背景图片

    1.在xxDlg.h中定义CBrush m_brush 2.在对话框的消息响应中添加一个ON_WM_CTLCOLOR消息响应 3.添加背景图(方法前一篇随笔有讲到) 4.OnCtlColor消息响应函 ...

  3. [OutLook]关闭Outlook时最小化

    关闭Outlook时最小化 dll 11.首先把dll 文件复制到C:\Users\hetao\AppData\Roaming\Microsoft\AddIns 22.然后以管理员的方式运行cmd.e ...

  4. 使用谷歌CoLaboratory训练神经网络

    前言 Colaboratory 是一个 Google 研究项目,旨在帮助传播机器学习培训和研究成果.它是一个 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行.Colabo ...

  5. Garbage-Only-One的IO路

    我的任务计划 刷题计划 BZOJ 1.1202 2.1008 3.等等 搜索 1.搜索题单 学习计划 树 1.树状数组or树状数组or树状数组 2.线段树 搜索 1.A*

  6. Filter简易实现.

    一 代码结构: 二 代码 Test.java: package com.demo.test; import com.demo.filter.ApplicationFilterChain; import ...

  7. Java Gui坐标绝对布局

    JFrame 要setLayout 为null setSize 设置大小 setLocation 设置位置 下面是自己准备做的一个QQ群助手,抓的是qun.qq.com的协议 这是界面设计图 运行效果 ...

  8. 团队第六次 # scrum meeting

    github 本此会议项目由PM召开,召开时间为4-10日晚上9点 召开时长20分钟 任务表格 袁勤 负责协调前后端 https://github.com/buaa-2016/phyweb/issue ...

  9. C#导出Excel后关闭进程EXCEL.EXE

    在C#中使用Microsoft.Office.Interop.Execl 导出excel 表格时,将以下两个属性亩后,在导完后, Excel.exe 进程无法关闭. // excel app 是否可见 ...

  10. 如何实现 C/C++ 与 Python 的通信?

    属于混合编程的问题.较全面的介绍一下,不仅限于题主提出的问题.以下讨论中,Python指它的标准实现,即CPython(虽然不是很严格) 本文分4个部分 1. C/C++ 调用 Python (基础篇 ...