MySQL Insert Buffer

来源:互联网 发布:一般淘宝客服打字 编辑:程序博客网 时间:2024/06/14 06:58


mysql> show engine innodb status\G;

。。。。。。

-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 1931, seg size 1933,
9528578 inserts, 9544567 merged recs, 963971 merges
Hash table size 17393, node heap has 2 buffer(s)
0.00 hash searches/s, 5000.00 non-hash searches/s
---

解析:

size : 表示没有被merge的页数

free list len: 表示空闲的页面(这些页面从未被用过)

seg size:表示Insert Buffer分配大小

inserts: 表示做了多少此insert操作,merged recs: 表示被merge的记录数,merges: 表示进行了多少此merge操作.

从上面这些数据可以看到Insert Buffer减少了1/10的IO操作 (963971/9528578)


Insert Buffer

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

Insert Buffer(changebuffer)的核心思想:

当数据库需要对2级索引进行修改时,先不从外存读页面,而是将这些更新缓存在内存中,在特定的条件下,统一将这些更新apply到相应的2级索引页面上,这样做可以减少读IO的次数,并且相邻的页面的读IO可以合并。之所以无法对主键和唯一索引进行优化是因为惟一性判断需要读取实际索引页面中的数据,这就和insert buffer 减少读io的初衷背离了。即Insert对于主键来说是一个顺序IO,对于secondary index 更新操作则是一个随机IO,Insert Buffer可以将多个随机IO merge成 一个 有利于减少随机IO。

Insert Buffer包含于Innodb Buffer Pool,在一个InnoDB系统中,insert buffer的内存占用是比较大的,最大可以达到buffer pool的1/2。为了保证insert buffer的恢复能在较短时间内完成,insert buffer pages也会由dirty page flush操作写回disk。系统崩溃时,就能够保证insert buffer table (SYS_IBUF_TABLE)能够较快恢复。

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操作

Innodb_fast_shutdown告诉innodb在它关闭的时候该做什么工作。有三个值可以选择:
当选择0时表示在innodb关闭的时候,需要purge all,merge insert buffer,flush dirtypages。这是最慢的一种关闭方式,但是restart的时候也是最快的。

参考: http://blog.csdn.net/dukope/article/details/9013695




0 0
原创粉丝点击