InnoDB存储引擎是第一个完整支持ACID事务的MySql存储引擎,其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有效地利用以及使用CPU和内存。
上图是InnoDB存储引擎的体系结构,可以看到InnoDB存储引擎有很多内存块,这些内存块组成了一个大的内存池,负责如下工作:
维护所有进程/线程需要访问的多个内部数据结构; 缓存磁盘上的数据,方便快速地读取,同时在对磁盘文件的数据修改之前在这里缓存。重做日志(redo log)缓冲。后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存是最近的数据 。此外,还将已经修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能恢复到正常运行状态。
InnoDB存储引擎是多线程的模型,后台有多个不同的后台线程,负责处理不同的任务。
Master Thread Master Thread是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲、UNDO页的回收等。IO Thread 在 InnoDB存储引擎中大量使用异步IO来处理写IO请求,这样可以极大地提高数据库的性能。 而IO Thread的工作主要是负责这些IO请求的回调处理。目前有4个read thread和4个write thread和1个insert thread和1个log IO thread。 通过下面的命令观察IO thread: mysql> show engine innodb status\G下面是部分输出:
show engine innodb status -------- FILE I/O -------- I/O thread 0 state: waiting for completed aio requests (insert buffer thread) I/O thread 1 state: waiting for completed aio requests (log thread) I/O thread 2 state: waiting for completed aio requests (read thread) I/O thread 3 state: waiting for completed aio requests (read thread) I/O thread 4 state: waiting for completed aio requests (read thread) I/O thread 5 state: waiting for completed aio requests (read thread) I/O thread 6 state: waiting for completed aio requests (write thread) I/O thread 7 state: waiting for completed aio requests (write thread) I/O thread 8 state: waiting for completed aio requests (write thread) I/O thread 9 state: waiting for completed aio requests (write thread) purge thread 事务被提交之后,其所使用的undolog可能不在需要了,因此需要Purge Thread来回收已经使用并分配的undo页。 在InnoDB1.1版本之前,purge操作是在Master thread中完成的。从1.1版本开始,purge操作可以独立到单独的线程中,以此来减轻master thread的工作。不过,需要在配置文件中添加如下命令才可以启用独立的Purge Thread: [mysqld] innodb_purge_threads=1从版本1.2开始,InnoDB支持多个Purge Thread,这样的目的是为了进一步加快undo页的回收。 通过下面命令可以查看InnoDB开启了多少个purge thread:
mysql> show variables like 'innodb_purge_threads'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | innodb_purge_threads | 0 | +----------------------+-------+ 1 row in set (0.00 sec)可以看到我的没有配置purge thread为独立的线程。
Page Cleaner Thread Page Cleaner Thread是在InnoDB1.2.X版本中引入的。其作用是将之前版本中脏页的刷新操作都放入到单独的线程中来完成。 其目的是减轻master thread的工作以及对于用户查询线程的阻塞,进一步提高InnoDB存储引擎的性能。