今天在做一个大业务的数据删除时,看到下面的性能曲线图

在删除动作开始之后,insert buffer 大小增加到140。对于这些状态参数的说明

InnoDB Insert Buffer

插入缓冲,并不是缓存的一部分,而是物理页,对于非聚集索引的插入或更新操作,不是每一次直接插入索引页.而是先判断插入的非聚集索引页是否在缓冲池中.如果在,则直接插入,如果不再,则先放入一个插入缓冲区中.然后再以一定的频率执行插入缓冲和非聚集索引页子节点的合并操作.

使用条件:非聚集索引,非唯一

Ibuf Inserts

插入的记录数

Ibuf Merged

合并的页的数量

Ibuf Merges

合并的次数

如果merges/merged的值等于3/1,则代表插入缓冲对于非聚集索引页的IO请求大约降低了3倍

InnoDB Insert Buffer Usage

Ibuf Cell Count

分段大小

Ibuf Used Cells

插入缓冲区的大小

Ibuf Free Cells"自由列表"的长度

可以这样理解,在平时正常业务下,需要合并的二级索引基本没有,在做批量大删除的时候,产生了很多需要合并的二级索引改变。

看看合并操作节省了多少IO请求,(1034310+3)/113909=9.08,

-------------------------------------INSERT BUFFER AND ADAPTIVE HASH INDEX-------------------------------------Ibuf: size1, free list len 134, seg size 136, 113909merges

merged operations:

insert3, delete mark 2319764, delete 1034310discarded operations:

insert0, delete mark 0, delete 0Hash table size288996893, node heap has 304687buffer(s)1923.58 hash searches/s, 1806.60 non-hash searches/s

摘录一段朋友博客上对于insert buffer的说明

一,插入缓冲(Insert Buffer/Change Buffer):提升插入性能

只对于非聚集索引(非唯一)的插入和更新有效,对于每一次的插入不是写到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,如果在则直接插入;若不在,则先放到Insert Buffer 中,再按照一定的频率进行合并操作。这样通常能将多个插入合并到一个操作中,提升插入性能。使用插入缓冲的条件:*非聚集索引*非唯一

插入缓冲最大使用空间为1/2的缓冲池大小,不能调整大小,在plugin innodb中,升级成了Change Buffer。不仅对insert,对update、delete都有效。其参数是:

innodb_change_buffering,设置的值有:inserts、deletes、purges、changes(inserts和deletes)、all(默认)、none。

可以通过参数控制其使用的大小:

innodb_change_buffer_max_size,默认是25,即缓冲池的1/4。最大可设置为50。在5.6中被引入。

上面提过在一定频率下进行合并,那所谓的频率是什么条件?1)辅助索引页被读取到缓冲池中。正常的select先检查Insert Buffer是否有该非聚集索引页存在,若有则合并插入。2)辅助索引页没有可用空间。空间小于1/32页的大小,则会强制合并操作。3)Master Thread 每秒和每10秒的合并操作。

innodb buffer pool 包含的数据页类型有:索引页,数据页,undo页,插入缓冲(insert buffer),自适应哈希索引,innodb存储是锁信息,数据字典信息等,结构图如下

有几个问题需要回答

1:为什么会有insert buffer,insert buffer能帮我们解决什么问题?

2:insert buffer有什么限制,为什么会有这些限制?

先说第一个问题。

举个现实中的例子来做说明,我们去图书馆还书,对应图书馆来说,他是做了insert(增加)操作,管理员在1小时内接受了100本书,这时候他有2种做法把还回来的书归位到书架上

1)每还回来一本书,根据这本书的编码(书柜区-排-号)把书送回架上

2)暂时不做归位操作,先放到柜面上,等不忙的时候,再把这些书按照书柜区-排-号先排好,然后一次性归位

用方法1,管理员需要进出(IO)藏书区100次,不停的登高爬低完成图书归位操作,累死累活,效率很差。

用方法2,管理员只需要进出(IO)藏书区1次,对同一个位置的书,不管多少,都只要爬一次楼梯,大大减轻了管理员的工作量。

所以图书馆都是按照方法2来做还书动作的。但是你要说,我的图书馆就20本书,1个0.5米的架子,方法2和1管理起来都很方便,这种情况不在我们讨论的范围。当数据量非常小的时候,就不存在效率问题了。

关系数据库在处理插入操作的时候,处理的方法和上面类似,每一次插入都相当于还一本书,它也需要一个柜台来保存插入的数据,然后分类归档,在不忙的时候做批量的归位。这个柜台就是insert buffer.

我想这就是为什么会有insert buffer,更多的是处于性能优化的考虑。

再说第二个问题,有什么限制:“只对于非聚集索引(非唯一)的插入和更新有效”

为什么对于非聚集索引(非唯一)的插入和更新有效?

还是用还书的例子来说,还一本书A到图书馆,管理员要判断一下这本书是不是唯一的,他在柜台上是看不到的,必须爬到指定位置去确认,这个过程其实已经产生了一次IO操作,相当于没有节省任何操作。

所以这个buffer只能处理非唯一的插入,不要求判断是否唯一。聚集索引就不用说了,它肯定是唯一的,mysql现在还只能通过主键聚集。

在MYSQL里面,insert buffer的大小在代码里面设定的最大可以到整个innodb buffer pool size的50%。这其实是不科学的,能够想象一下一个100平米的图书馆,有50平米是做退书的柜台是什么样子的吗?

前面说到管理员图书归位的时候,他会选择在“不忙的时候”再去做,优先处理前台退书操作,这个在MYSQL里面是这样体现的:

1)每1秒,如果IO次数小于5,合并插入缓冲。

2)每10秒,IO次数小于200,合并最多5个插入缓冲。

mysql 插入缓冲_innodb insert buffer 插入缓冲区的理解相关推荐

  1. mybatis存在就不插入_MyBatis使用Insert无法插入解决办法

    前言 今天在学习MyBatis的时候,使用select查询语句可以查出结果并准确无误,但是使用insert语句的时候无法插入,因为我使用的是mysql数据库,并且给主键ID设置了自动递增,在每次插入之 ...

  2. [MySQL] InnoDB三大特性之 - 插入缓冲

    InnoDB存储引擎有三大特性非常令人激动,它们分别是插入缓冲.两次写和自适应哈希,本篇文章先介绍第一个特性 - 插入缓冲(insert buffer) 在上一篇<MySQL - 浅谈InnoD ...

  3. 什么是Mysql的next-key、插入缓冲、二次写、自适应哈希索引和预读

    目录 楔子 一.间隙锁(Next-Key锁) 二.插入缓冲(Insert Buffer) 2.1.什么是insert buffer? 2.2.insert buffer的触发条件? 2.3.为什么不能 ...

  4. MySQL 批量插入数据,单次插入多少条数据效率最高

    文章目录 一.前言 二.批量插入前准备 1.插入到数据表的字段 2.计算一行字段占用的空间 3.在数据里做插入操作的时候,整体时间的分配 三.批量插入数据测试 1.SQL语句的大小限制 2.查看服务器 ...

  5. MySQL 批量插入数据,一次插入多少行数据效率最高?

    一.前言 我们在操作大型数据表或者日志文件的时候经常会需要写入数据到数据库,那么最合适的方案就是数据库的批量插入.只是我们在执行批量操作的时候,一次插入多少数据才合适呢?假如需要插入的数据有百万条,那 ...

  6. 按顺序插入图片_MysqlInnodb特性之插入缓存

    InnoDB存储引擎的关键特性包括插入缓冲.两次写(double write).自适应哈希索引(adaptive hash index).这些特性为InnoDB存储引擎带来了更好的性能和更高的可靠性. ...

  7. Mysql关键特性-插入缓冲 (Insert Buffer)

    1.什么是插入缓冲 (Insert Buffer insert buffer是一种特殊的数据结构(B+ tree)并不是缓存的一部分,而是物理页,这里讲的缓冲是针对的非聚集索引并且索引不是唯一的. 对 ...

  8. mysql 插入缓冲

    在看<mysql技术内幕:innodb存储引擎>看到插入缓冲,google了一下,发现如下解释: 摘录自:http://www.itpub.net/viewthread.php?tid=1 ...

  9. php执行mysql insert,当执行mysql insert 时插入两条是咋回事

    当执行mysql insert 时插入两条是怎么回事? 本帖最后由 Eason_____________ 于 2013-07-25 11:25:44 编辑 //做了一个手机上传图片到服务器的功能.但是 ...

最新文章

  1. 给博客增加了一个主题Nautica02Liquid
  2. tcga数据下载_好东西丨零基础入门TCGA
  3. [每天一个知识点]3-程序员的三大美德(2)
  4. display:inline-block
  5. endnote 参考文献加序号_Endnote教程|页码缩写
  6. 设计模式---适配器模式(转自可均可可博客)
  7. ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题
  8. 事件处理机制--浏览器流程处理分析
  9. html提值到php 冒泡,如何实现Html事件冒泡
  10. python 微服务 etcd_python etcd api
  11. 再也不用装双系统和虚拟机了!——吐血推荐令Windows与Liunx合二为一的WSL2
  12. 代码也浪漫——Python烟花秀
  13. Porsche保时捷Taycan维修手册电路图接线图技术培训手册维修技术资料
  14. pptswot分析图怎么做_SWOT分析图-PPT模板.pptx
  15. 自定义view画钟表
  16. 记nuc8的开箱以及安装hackintosh
  17. Python语言实现机器学习
  18. PTA 7-4 分钟秒钟的时间相减
  19. 文科生学什麼计算机知识,我们学习计算机知识究竟是在学什么?
  20. 《软件工程导论第6版》--张海藩 牟永敏 课后答案及其详解 第5章 总体设计

热门文章

  1. sqlserver笔记
  2. Tesla M40 下Ubuntu anaconda pycharm pytorch安装
  3. Mr. Kitayuta vs. Bamboos
  4. 【中创福利】有一种年味叫公司发年货
  5. python标准图形库——turtle
  6. 计算机毕业设计android的手机点名签到学生请假考勤系统app(源码+系统+mysql数据库+Lw文档)
  7. 2019年面试大概问题
  8. 开发调试指令大全--(博通开发调试命令)
  9. C语言学习之路-由浅入深(快速掌握c基础)
  10. dumb-init:一个Docker容器初始化系统