InnoDB存储引擎的关键特性
InnoDB存储引擎的关键特性包括:
- 插入缓冲(Insert Buffer)
- 两次写(double write)
- 自适应哈希索引(Adaptive Hash Index)
- 异步I/O (Async IO)
- 刷新邻接页(Flush Neighbor Page)
插入缓冲(Insert Buffer)
和数据页一样,是物理页的一个组成部分
在InnoDB存储引擎中,主键是行唯一的标识符。通常应用程序中行记录的插入顺序是按照主键递增的顺序进行插入的。因此,插入聚集索引一般是顺序的,不需要磁盘的随机读取。
但是不可能每张表上只有一个聚集索引,更多情况下,一张表上有多个非聚集的辅助索引。
create table t(
a int auto_increament,
b varchar(30),
primary key(a),
key(b)
)
在进行插入操作时,数据页的存放还是按照主键a进行顺序存放的,但是对于非聚集索引叶子节点的插入不再是顺序的了,这是就需要离散的访问非聚集索引页,由于随机读取的存在而导致了插入操作性能的下降。当然这并不是这个b字段上索引的错误,而是因为B+树的特性决定了非聚集索引插入的离散型。
对于非聚集索引的插入或更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在,直接插入,不在,则先放入到一个Insert buffer对象中。然后再以一定的频率和情况进行insert buffer和辅助索引页子节点的merge操作,这时通常能将多个插入合并到一个操作中,大大提高了对于非聚集索引插入的性能。
Insert Buffer的使用需要同时满足两个条件
- 索引是辅助索引(secondary index)
- 索引不是唯一的
注:辅助索引不能是唯一的,因为在插入缓冲时,数据库并不去查找索引页来判断插入的记录的唯一性。如果去查找肯定又会离散读取的情况发生,从而导致Insert Buffer失去了意义。
通过命令show engine innodb status;查看
-------------------------------------
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 2267, node heap has 2 buffer(s)
Hash table size 2267, node heap has 0 buffer(s)
Hash table size 2267, node heap has 0 buffer(s)
Hash table size 2267, node heap has 0 buffer(s)
Hash table size 2267, node heap has 3 buffer(s)
Hash table size 2267, node heap has 1 buffer(s)
Hash table size 2267, node heap has 0 buffer(s)
Hash table size 2267, node heap has 2 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s
seg size表示当前Insert Buffer的大小为2*16KB;free list len代表了空闲列表的长度