插入缓冲( insert buffer )
对于非聚集索引的插入和更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入;若不在,则先放到一个 Insert buffer对象中。表象上看数据库这个非聚集的索引已经插到叶子节点,而实际上没有,只是存放到另外一个位置。然后再以一定的频率和情况进行insert buffer和辅助索引页子节点的merge操作,这时将多个插入合并到一个操作中,这就大大提高了非聚集索引插入的性能。
需要同时满足的条件:
(1) 索引是辅助索引
(2) 索引不是唯一的
查看插入缓冲情况: show engine innodb status;
Ibuf: size XXX, free list len XXX, seg size XXXX,
XXXXX inserts, XXXXX merged recs, XXXX merges
配置参数: innodb_buffer_pool 默认2 ,表示插入缓存能够占用缓存池最大空间为1/2
两次写 ( Double Write )
次写给innodb带来的是可靠性,主要用来解决部分写失败(partial page write)。doublewrite有两部分组成,一部分是内存中的doublewrite buffer,大小为2M,另外一部分就是物理磁盘上的共享表空间中连续的128个页,即两个区,大小同样为2M。当缓冲池的胀业刷新时,并不直接写硬 盘,而是通过memcpy函数将脏页先拷贝到内存中的doublewrite buffer,之后通过doublewrite buffer再分两次写,每次写入1M到共享表空间的物理磁盘上,然后马上调用fsync函数,同步磁盘
自适应哈希索引( Adaptive Hash Index)
InnoDB引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,称之为AHI。AHI是通过缓冲池的B+树页构造而来,因此建立的速度很快,而且不需要对整张表构建hash索引。InnoDB存储引擎会自动根据访问的频率和模式来自动地为某些热点页建立hash索引。
异步IO( Async IO)
刷新邻接页( Flush Neighbor Page)