InnoDB是储存引擎支持事务,其设计目标主要面向在线事务处理的应用,其特点是行锁设计、支持外键、支持非锁定读,是Mysql_5.5.8版本以后的默认储存引擎。
InnoDB有以下几大特性:
1.插入缓冲(Insert Buffer)
innodb采用了在共享表空间维护一个B+树的数据结构去存储对于非聚集索引(不唯一的辅助索引)的插入和更新操作(记录了插入的页地址和数据信息),而不是直接去硬盘上寻找需要对应的索引页进行数据的插入和更新,因为对于该类索引的插入和更新的实时性要求并不是那么的高,一般情况下当需要使用到该索引页的时候,该索引页被加载进innoDB的缓冲池才会进行数据的插入,或者有多个插入更新操作都需要对同一个索引页进行操作时,会将多个操作合并为一个IO操作,这样就避免了大量的随机IO,当然,如果该索引页存在于缓冲池内,则会直接进行插入。
2.两次写(Double Write)
为了防止正在将页写入表中时数据库发生宕机的情况(部分写失效),正在写入的页被损坏,redolog不能对其进行重做修复。所以Innodb在写入页的时候,会在内存中开辟一个默认大小为2M的空间用于缓冲(doublewrite buffer),同时也会在硬盘上的共享表空间开辟一个的连续2M的空间(128页)。在对缓冲池的脏页进行刷新时,并不直接写磁盘,而是将脏页先复制到内存中doublewrite buffer中,之后再通过doublewrite buffer再分两次,每次1MB顺序的写入共享表空间的物理磁盘上,然后再立刻同步磁盘。这样的话即使在同步磁盘的过程中发生数据库宕机,也可以在共享表空间内找到部分写失效的页的副本,用redolog进行数据恢复。
3.自适应哈希索引(Adaptive Hash Index)
InnoDB会监控对表上索引页的查询,并会自动根据访问的频率和模式来自动地为某些热点页建立哈希索引。例如对某张表的上的某一个页连续100次以上用同一种查询条件进行访问,那么InnoDB就会自动的生产哈希索引,之后使用同一查询条件进行访问时,就可以不走常规的数据库查询,而是直接通过建立的哈希索引找到该页。
4.异步IO (Async IO)
为了提高磁盘的操作性能,InnoDB采用了异步IO(AIO)的方式来处理磁盘操作。于AIO对应的是同步IO,即每一次IO操作,都需要等待此次操作结束才能继续接下来的操作,如果用户发出的是一条索引扫描的查询,那么这条SQL查询语句可能需要扫描对各索引页,也就是需要进行多次IO操作。在每扫描一个页并等待其完成后再进行下一次扫描,这是没有必要的,用户可以在发出一个IO请求后立即再发出另一个IO请求,当全部IO请求发送完毕后,等待所以IO操作的完成,这就是AIO。
AIO的一个优势是可以进行IO Merge操作,即将多个IO合并为一个IO,例如有3个IO需要访问的页正好是连续的(6)、(7)、(8),那么就会合并为一个IO直接读取第6页到第8页。
5.刷新临接页(Flush Neighboor Page)
InnoDB在刷新一个脏页的时候,会在缓冲池里检测该脏页所在的区(一个区为1M的连续地址)是否还有其他的脏页,如果有就会一起进行刷新,这样就可以将多个IO操作合并为1个IO操作(固态硬盘有很高的随机IO能力,可以关闭这一特性,以提升性能)。