InnoDB关键特性包括:

插入缓冲(Insert BUffer),两次写(Double Write),自适应哈希索引(Adaptive Hash Index),

异步IO(Async IO),刷新邻接页(Flush Neighbor Page)

INSERT BUFFER 可能是INNODB 存储引擎关键特性中最令人激动与兴奋的一个功能。INSERT

BUFFER和数据页一样,也是物理页的一个组成部分。

插入缓冲被开创性地用于解决这个问题:对于非聚集索引的插入或更新,并不是每次直接插入索引页,先判断这个索引页是否在缓冲池,惹在,则直接插入,惹不在,则先放在插入缓冲,再以一定频率执行插入缓冲和非聚集索引页子节点的合并操作(merge),大大提升性能。

插入缓冲的必备条件:NON UNIQUE,SECONDARY INDEX.

Change Buffer 可将其视为Insert Buffer的升级,InnoDB 存储引擎可以对DML操作---INSERT、UPDATE、DELETE 都进行缓冲,分别是:Insert Buffer、Delete Buffer、Purge Buffer.

对一条记录进行UPDATE的操作可能分为两个过程:

(1)将记录标记为已删除;(2)真正将记录删除。

而PURGE BUFFER对应UPDATE操作的第二个过程,即将记录真正的删除。

同时INNODB存储引擎提供了参数INNODB_change_buffering,用来开启各种BUFFER的选项。该参数可选的值为:INSERTS,DELETES,PURGES,CHANGES,ALL,NONE.

两次写 (Doublewrite)

如果说 INSERT BUFFER 带给INNODB 存储引擎的性能上的提升,那么DOUBLEWRITE 带给INNODB存储引擎的是数据页的可靠性。这是因为,当数据库宕机是,InnoDB存储引擎可能正在写入某个页到表中,而这个时候只写了一部分(如16K的页,只写了前4K),这情况被称为部分写失效(partial page write)。可能你会想着用重做日志进行恢复。这是一个办法。但是重做日志记录的是对页的物理操作,如偏移量800,写"aaaa'记录。如果这个页本身已经发生啦损坏,在对其进行重做是没有意思的。这就是在应用重做日志前,需要一个页的副本,当写入失效时,先通过页的副本来还原该页,再进行重做。

DOUBLE WRITE 由两部分组成 一部分是内存中的DOUBLEWRITE BUFFER,大小为2MB,另一部分是物理磁盘上共享表空间中连续的128个页,即2个区,大小同样是2MB.

自适应哈希索引

      哈希是一种非常快的查找方法,在一般情况下这种查找的时间复杂度为0(1)。而B+树的查找次数,取决于B+树的高度,在生成环境中,B+树的高度一般为3-4层,不需要查询3-4次。InnoDB存储引擎会监控对表上各索引页的查询。如果观察到简历哈希索引可以提升速度,这简历哈希索引,称之为自适应哈希索引(Adaptive Hash Index, AHI)。AHI是通过缓冲池的B+树页构造而来的。因此建立的速度非常快,且不要对整张表构建哈希索引。InnoDB存储哟inquiry会自动根据房屋的频率和陌生来自动的为某些热点页建立哈希索引。

异步IO (Asy IO)

系统都采用异步IO(AIO)。在InnoDB 1.1.x之前,AIO的实现是通过InnoDB存储引擎中的代码来模拟的。但是从这之后,提供了内核级别的AIO的支持,称为Native AIO。Native AIO需要操作系统提供支持。Windows和Linux都支持,而Mac则未提供。在选择MySQL数据库服务器的操作系统时,需要考虑这方面的因素。MySQL可以通过参数innodb_use_native_aio来决定是否启用Native AIO。在InnoDB存储引擎中,read ahead方式的读取都是通过AIO完成,脏页的刷新,也是通过AIO完成。

刷新邻接页
InnoDB存储引擎在刷新一个脏页时,会检测该页所在区(extent)的所有页,如果是脏页,那么一起刷新。这样做的好处是通过AIO可以将多个IO写操作合并为一个IO操作。该工作机制在传统机械磁盘下有显著优势。但是需要考虑下吧两个问题:a.是不是将不怎么脏的页进行写入,而该页之后又会很快变成脏页?b.固态硬盘有很高IOPS,是否还需要这个特性?为此InnoDB存储引擎1.2.x版本开始提供参数innodb_flush_neighbors来决定是否启用。对于传统机械硬盘建议使用,而对于固态硬盘可以关闭