innodb特性:
    主体系结构:默认7个后台线程,4个io thread(insert buffer、log、read、write),1个master thread(优先级最高),1个锁(lock)监控线程,1个错误监控线程。可以通过show engine innodb status来查看。新版本已对默认的read thread和write thread分别增大到4个,可通过show variables like 'innodb_io_thread%'查看。
    存储引擎组成:缓冲池(buffer pool)、重做日志缓冲池(redo log buffer)以及额外的内存池(additional memory pool).具体配置可由show variables like 'innodb_buffer_pool_size'、show variables like
'innodb_log_buffer_size'、show variables like 'innodb_additional_mem_pool_size'来查看。
    缓冲池:占最大块内存,用来存放各种数据的缓存包括有索引页、数据页、undo页、插入缓冲、自适应哈希索引、innodb存储的锁信息、数据字典信息等。工作方式总是将数据库文件按页(每页16k)读取到缓冲池,然后按最近最少使用(lru)的算法来保留在缓冲池中的缓存数据。如果数据库文件需要修改,总是首先修改在缓存池中的页(发生修改后即为脏页),然后再按照一定的频率将缓冲池的脏页刷新到文件。通过命令show engine innodb status;来查看。
    日志缓冲:将重做日志信息先放入这个缓冲区,然后按一定频率将其刷新到重做日志文件。
  
innodb特性介绍_status


    master thread:
    loop主循环每秒一次的操作:
      日志缓冲刷新到磁盘,即使这个事务还没有提交。(总是执行,所以再大的事务commit 
      的时间也是很快的)           
      合并插入缓冲(innodb当前一秒发生的io次数小于5次则执行)
      至多刷新100个innodb的缓冲池中的脏页到磁盘(超过配置的脏页所占缓冲池比例则执
      行,在配置文件中由innodb_max_dirty_pages_pac决定,默认是90,新版本是75,
      google建议是80)
      如果当前没用用户活动,切换到backgroud loop        

    loop主循环每10秒一次的操作:
      刷新100个脏页到磁盘(过去10秒IO操作小于200次则执行)
      合并至多5个插入缓冲(总是)
      将日志缓冲到磁盘(总是)
      删除无用的Undo页(总是)
      刷新100个或者10个脏页到磁盘(有超过70%的脏页,刷新100个脏页;否则刷新10个脏页)
      产生一个检查点

    backgroud loop,若当前没有用户活动(数据库空闲时)或者数据库关闭时,就会切换到这个循环:
      删除无用的Undo页(总是)
      合并20个插入缓冲(总是)
      跳回到主循环(总是)
      不断刷新100个页,直到符合条件(可能在flush loop中完成)

    如果flush loop中也没有什么事情可以做了,InnoDB存储引擎会切换到suspend_loop,将master thread挂起,等待事件的发生。若启用了InnoDB存储引擎,却没有使用任何InnoDB存储引擎的表,那么master thread总是处于挂起状态

    插入缓冲:不是缓冲池的一部分,Insert Buffer是物理页的一个组成部分,它带来InnoDB性能的提高。根据B+算法(下文会提到)的特点,插入数据的时候会主键索引是顺序的,不会造成数据库的随机读取,而对于非聚集索引(即辅助索引),叶子节点的插入不再是顺序的了,这时需要离散地访问非聚集索引,插入性能在这里变低了。InnoDB引入插入缓冲,判断非聚集索引页是否在缓冲池中,如果在则直接插入;不在,则先放在 插入缓冲区中。然后根据上述master thread中介绍的,会有一定的频率将插入缓冲合并。此外,辅助索引不能是唯一的,因为插入到插入缓冲时,并不去查找索引页的情况,否则仍然会造成随机读,失去插入缓冲的意义了。插入缓冲可能会占缓冲池中内存,默认也能会占到1/2,所以可以将这个值调小点,到1/3。通过IBUF_POOL_SIZE_PER_MAX_SIZE来设置,2表示1/2,3表示1/3。

    两次写:  它带来InnoDB数据的可靠性。如果写失效,可以通过重做日志进行恢复,但是重做日志中记录的是对页的物理操作,如果页本身损坏,再对其进行重做是没有意义的。所以,在应用重做日志前,需要一个页的副本,当写入失效发生时,先通过页的副本来还原该页,再进行重做,这就是doublewire。
     恢复数据=页副本+重做日志
             
   
innodb特性介绍_insert_02

             
   自适应哈希索引:InnoDB存储引擎提出一种自适应哈希索引,存储引擎会监控对表上索引的查找,如果观察到建立建立哈希索引会带来速度的提升,根据B+树和索引来建立哈希索引,所以称之为自适应的。自适应哈希索引能用来搜索in、和<=>的相等比较,不能加快范围查询等值的查询,如select * from table where index_col='***', 此外自适应哈希是由InnoDB存储引擎控制的,我们只能通过innodb_adaptive_hash_index来禁用或启用,默认开启。
IO 进程:mysql 5.5 &  mysql 5.6.5 (10个),
I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: waiting for i/o request (read thread)
I/O thread 3 state: waiting for i/o request (read thread)
I/O thread 4 state: waiting for i/o request (read thread)
I/O thread 5 state: waiting for i/o request (read thread)
I/O thread 6 state: waiting for i/o request (write thread)
I/O thread 7 state: waiting for i/o request (write thread)
I/O thread 8 state: waiting for i/o request (write thread)
I/O thread 9 state: waiting for i/o request (write thread)
以前的版本5.0以及之前的版本都是 4个IO 进程(1 log thread+ 1 insert buffer thread+1 read thread+ 1 write thread),从 innodb  plugin 开始,默认增加到10(1 log thread+ 1 insert buffer thread+4 read thread+ 4 write thread)个。
3. innodb  plugin 以前(包括windows)参数  innodb_file_io_threads (默认值为4)设置 io 进程的个数, 从innodb  plugin 开始不再使用参数  innodb_file_io_threads,分别用innodb_read_io_threads、 innodb_write_io_threads  分别来设置read和write thread 的个数。