`

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,

mysql>show innodb status;
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 134, seg size 136, 113909 merges
merged operations:
 insert 3, delete mark 2319764, delete 1034310
discarded operations:
 insert 0, delete mark 0, delete 0
Hash table size 288996893, node heap has 304687 buffer(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个插入缓冲。

转自:http://www.cnblogs.com/zuoxingyu/p/3761461.html
  • 大小: 63.9 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    【mysql】InnoDB关键特性—插入缓冲

    【MySQL】InnoDB存储引擎的关键特性之一是插入缓冲(Insert Buffer),它对于提高数据库的插入性能至关重要,尤其是在处理大量辅助索引插入时。在深入理解插入缓冲之前,我们需要先了解InnoDB中的两种索引类型:聚集...

    XtraDB、InnoDB 内部结构示意图

    而InnoDB的Insert Buffer部分是缓冲池的一部分,且可能占用缓冲池的一半大小。 4. 并发和缓冲写入机制 innodb_read_io_threads和innodb_write_io_threads参数分别用于管理读写I/O线程。InnoDB通过doublewrite机制将...

    InnoDB的关键特性-插入缓存,两次写,自适应hash索引详解

    InnoDB存储引擎的关键特性包括插入缓冲、两次写(double write)、自适应哈希索引(adaptivehashindex)...Buffer信息固然不错,但是InsertBuffer和数据页一样,也是物理页的一个组成部分。主键是行唯一的标识符,在应

    MySQL InnoDB 源码实现分析

    2. **插入操作**:当对非聚簇索引进行插入操作时,InnoDB不会立即更新聚簇索引,而是将该操作放入Insert Buffer。 3. **合并过程**:后台线程会定期检查Insert Buffer,并将其中的数据与聚簇索引进行合并,这一过程...

    浅谈innodb的索引页结构,插入缓冲,自适应哈希索引

    当需要修改的二级索引页不在缓冲池中,InnoDB会将修改记录到插入缓冲区(Insert Buffer),然后在合适的时候合并到磁盘上的B树中,降低了随机IO的次数,从而提高性能。在大量插入时,插入缓冲能显著提升效率,但异常...

    InnoDB 中文参考手册(CHM)

    9. **自增列与插入缓冲(Insert Buffer)** 对于非聚集索引的插入,InnoDB会使用插入缓冲,以减少对非主键索引页的直接修改,提高插入性能。 10. **多版本并发控制(MVCC)** MVCC是InnoDB实现高并发的基础,...

    MySql innodb 引擎表存储分析

    - **插入缓冲空闲列表页** (Insert Buffer Free List Page):用于管理插入缓冲中的空闲页。 #### 创建新表的过程 当创建新表时,InnoDB初始分配32页的碎片页用于存放数据。这些页被称为“预分配”页。一旦这32页被...

    InnoDb 体系架构和特性详解 (Innodb存储引擎读书笔记总结)

    6. **插入缓冲(Insert Buffer)** - 非聚集索引的插入和更新操作不直接写入索引页,而是先存入Insert Buffer,然后定期合并到辅助索引。 - Insert Buffer的使用条件:索引必须是非聚集且非唯一的。 - Insert ...

    cacti-mysql-template指标解释.pdf

    - **InnoDB Insert Buffer**:监控InnoDB插入缓冲区的状态,包括其使用情况和效果。 - **InnoDB Insert Buffer Usage**:具体展示InnoDB插入缓冲区的利用率。 - **InnoDB Internal Hash Memory Usage**:监控InnoDB...

    MySQL高级-第07章-InnoDB数据存储结构

    5. **插入缓冲(Insert Buffer)** 为了提高插入非唯一二级索引的效率,InnoDB使用插入缓冲。当对非唯一二级索引进行插入时,如果目标页不在缓存池中,会先放入插入缓冲,待后续有机会时再合并到索引页。 6. **...

    py_innodb_page_type.tar.gz_page

    4. **插入缓冲位图页(Insert Buffer Bitmap Pages)**:用于管理插入缓冲,减少对非聚集索引的直接修改。 5. **插入缓冲节点页(Insert Buffer Node Pages)**:存储插入缓冲的B+树结构。 6. **Undo页(Undo Pages...

    Innodb的整体架构图1

    4. **插入缓冲(Insert Buffer)**:InnoDB使用插入缓冲来优化对非聚簇索引页的插入操作。非聚簇索引页的更新不直接写入磁盘,而是先放入内存的插入缓冲,等到合并时再批量写入,从而提高性能。 5. **缓存池...

    MySQL体系结构及原理(innodb)图文完美解析

    这是因为InnoDB内部使用了Insert Buffer技术来优化非唯一索引的插入效率。对于唯一索引,则不能使用Merge操作,因为需要检查重复性。 6. **索引字段不允许NULL值的原因** 当一个字段被定义为索引的一部分时,不...

    MySQL InnoDB小结1

    插入缓冲(Insert Buffer)优化了插入操作,特别是对于非聚簇索引的插入。重做日志(Redo Log)用于记录事务对数据页的更改,确保在系统崩溃时能够恢复未完成的事务。此外,还有undo日志,用于回滚事务。 InnoDB的...

Global site tag (gtag.js) - Google Analytics