InnoDB 插入缓存

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012507347/article/details/48730703

InnoDB 插入缓存

Insert Buffer (插入缓存),InnoDB储存引擎的关键特性之一。他并不是在内存中的缓存池的一部分,而是物理页的一部分,和一般的数据页一样。

Insert Buffer的功能

在InnoDB中,若主键(插入聚集索引Primary Key)自增,那么在页中存储时,会按主键顺序的存放,所以数据是集中的,大部分在一页中,这样会减少磁盘的离散读取,提高速度。
然而,当索引不唯一时,就需要使用辅助索引,而记录按主键是顺序的,对其他索引,如辅助索引,就不会是顺序的,再插入时就会慢,尤其是大批数据插入时。
Insert Buffer 的设计思想是,当按辅助索引插入时先将记录放在Insert Bufert中,然后在后台慢慢的合并回辅助索引页中。

create table test(
    a int(11) auto_increment,
    b varchar(11) ,
    primary key (a),
    key(b)
);

Insert Buffer的实现

其实Insert Buffer的数据结构是一颗B+树,其内存同样使用缓冲池。IBUF_POOL_SIZE_PER_MAX_SIZE定义了Insert Buffer 最多占用缓冲池的大小,默认值为2,表示最多可能占用1/2的缓冲池空间。
整个InnoDB使用一颗B+树。
Insert Buffer会将辅助索引记录缓存起来,当缓存记录过多时,就会将记录合并回页,然后经行插入操作。这就需要一个空间来记录各个辅助索引页的剩余空间。
在InnoDB中,存在一个Insert Buffer bitmap页,一个Insert Buffer bitmap管理16384个页(256个区),每一个辅助索引页在Insert Buffer bitmap页中占据4位空间。

大小 描述
IBUF_BITMAP_FREE 2 辅助索引页的剩余空间
IBUF_BITMAP_BUFFERED 1 辅助索引页是否已缓存在Insert Buffer中
IBUF_BITMAP_IBUF 1 该页是否是Insert Buffer树中的索引页

剩余空间用两位表示

  • 0:表示无可用空间
  • 1:表示剩余空间大于1/32页
  • 2:表示剩余空间大于1/16页
  • 3:表示剩余空间大于1/8页

当剩余空间小于1/32时,就会主动经行 Merge Insert Buffer 操作,这一步会在Master Thrend线程中经行。

Insert Buffer的树的结构

Insert Buffer的数据结构是一颗B+树,
其中非叶子节点存放的是search key(键值),其的构成

space marker offset
  • space为表空间id
  • marker用来兼容老版本
  • offset表示页所在偏移量

叶子节点构成

space marker offset metadata secondary index record
  • metadata 记录的每一列的类型,长度
  • secondary index record 记录的具体值

流程
1.一个辅助索引插入到页(space,offset)
2.检查这个页是否在缓冲池中
在:直接插入
不在:继续
3.构造一个search key
4.查询insert buffer树
5.生成逻辑记录并插入树中

查看Insert Buffer

mysql> show engine innodb status\g;

| InnoDB |      |
=====================================
2015-09-25 09:43:06 3bc0 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 6 seconds
-----------------
BACKGROUND THREAD
........
........
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
merged operations:
 insert 0, delete mark 0, delete 0
discarded operations:
 insert 0, delete mark 0, delete 0
Hash table size 276707, node heap has 1 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s

猜你喜欢

转载自blog.csdn.net/u012507347/article/details/48730703