1,Insert Buffer 作用
Insert Buffer包含于Innodb Buffer Pool,用于缓冲非唯一索引 [除primary key跟unique key] 叶子节点的插入操作 (5.5开始 insert buffer变为change buffer,支持了update delete操作)
为什么要有这么一个区域呢?
原因很简单:Insert对于主键来说是一个顺序IO,对于secondary index 更新操作则是一个随机IO,Insert Buffer可以将多个随机IO merge成 一个 有利于减少随机IO
2,Insert Buffer 位置
在一个InnoDB系统中,insert buffer的内存占用是比较大的,最大可以达到buffer pool的1/2。为了保证insert buffer的恢复能在较短时间内完成,insert buffer pages也会由dirty page
flush操作写回disk。系统崩溃时,就能够保证insert buffer table (SYS_IBUF_TABLE)能够较快恢复
3,Insert Buffer 何时 merge
有2种情况innodb会merge Insert Buffer 到磁盘
1),master loop 线程主动merge
若过去1s之内发生的I/O,小于系统I/O能力的5%,则主动进行一次Insert buffer的merge操作。Merge的页面数为系统I/O能力的5%,每10s,必定触发一次insert buffer merge动作.
Merge的页面数仍旧为系统I/O能力的5% (系统能力指innodb_io_capacity)
2),读取数据发现该page在Insert Buffer还没有被merge,那么innodb首先会做一个merge操作,所以此时读取的速度会降低
在系统负载较高时,merge操作会很少,而在系统比较空闲时,merge操作会非常频繁,所以当你的系统突然负载变低时,DB还有可能会进行很长一段时间的IO操作
4,查看Insert Buffer使用
我们可以通过show engine innodb status\G 查看Insert Buffer使用状况,如下是Insert Buffer信息部分
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 7545, free list len 3790, seg size 11336,
8075308 inserts, 7540969 merged recs, 2246304 merges
size部分表示没有被merge的页数
free list表示空闲的页面(这些页面从未被用过)
seg部分表示Insert Buffer分配大小
inserts表示做了多少此insert操作,merged recs表示被merge的记录数,merges表示进行了多少此merge操作
从上面这些数据可以看到Insert Buffer减少了3/4 的IO操作 (2246304/8075308)
参考资料:
1,http://www.mysqlops.com/2012/05/21/mysql-innodb-insert-buffer.html
2,http://www.mysqlperformanceblog.com/2009/01/13/some-little-known-facts-about-innodb-insert-buffer/
3,http://dev.mysql.com/doc/refman/5.1/en/innodb-insert-buffering.htm