InnoDB 是事务安全的mysql存储引擎,设计上采用了类似于oracle的架构。一般而言,在OLTP的应用中,INNODB应该作为核心应用表的首选存储引擎。同时,也是因为InnoDb的存在,才使得Mysql变得更有魅力。
第一、Innodb存储引擎概述
Innodb由Innobase Oy 公司开发,被包括在Mysql所有的二进制发行版本中,是windows下默认的表存储引擎。该存储引擎是第一个完整支持ACID事务的mysql存储引擎,行锁设计,支持MVCC,提供类似于oracle风格一致性非锁定读,支持外键,被设计用来最有效的利用内存和cpu。如果你熟悉oracle的架构,你会发现innodb于oracle很类似。
第二、InnoDB体系架构
InnoDB有多个内存块,你可以认为这些内存块组成了一个大的内存池,负责如下工作:
1、维护所有进程/线程需要访问的多个内部数据结构。
2、缓存磁盘上的数据,方便快速的读取,并且在对磁盘文件的数据进行修改之前在这里缓存。
3、重做日志缓冲。
后台线程主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外,将已修改的数据文件刷新到磁盘文件,同时保证在数据库中发生异常情况下InnoDB能恢复到正常运行状态。Innodb存储引擎是在一个被称做master therad的线程上几乎实现了所有功能。默认情况下,InnoDB存储引擎的后台线程有7个-4个IO thread,1个master thread,1个锁监控线程,1个错误监控线程。IO thread的数量有配置文件中的innodb_file_io_threads参数控制,默认为4个。
InnoDB存储引擎内存由:缓存池、重做日志缓冲池以及额外的内存池组成,分别由配置文件中的参数innodb_buffer_pool_size和innodb_log_buffer_size的大小决定。缓冲池是内存中最大的部分,用来存放各种数据的缓存。因为innodb的存储引擎的工作方式总是将数据库文件按页读取到缓冲池,然后按最近最少使用的算法来保留缓冲池中的数据。如果文件修改,总是首先修改在缓存池中的页,然后在按照一定的频率将缓存池的脏页刷新到文件。
第三、master thread
InnoDB存储引擎的主要工作都是在一个单独的后台线程master thread 中完成的。线程中每一秒的操作包括:
1、日志缓冲刷新到磁盘,即使这个事务还没有提交。
2、合并插入缓冲。
3、至多刷新100个innodb的缓冲池中脏页到磁盘。
4、如果当前没有用户活动,切换到background loop。
即使某个事务还没有提交,innodb还是会不断的去刷新缓冲池的内容来重做日志文件,这就是为什么再大的事务commit的时间也是很快的因为。