文章目录
InnoDB存储引擎
InnoDB是事务安全的MySQL存储引擎,通常来说,它是OLTP(Online Transactional Processing,联机事务处理)应用中核心表的首选存储引擎。
一、InnoDB存储引擎概述
从MySQL5.5版本开始,InnoDB开始是默认的表存储引擎(之前的版本InnoDB存储引擎仅在Windows下为默认的存储引擎)。该存储引擎是第一个完整支持ACID事务的MySQL存储引擎(BDB是第一个支持事务的MySQL存储引擎,现在以及停止开发)。
特点:
- 支持行锁
- 支持MVCC
- 支持外键
- 提供一致性非锁定读
InnoDB上处理插入/更新操作的速度平均为800次/秒。这都证明了InnoDB是一个高性能、高可用、高可扩展的存储引擎。
二、InnoDB存储引擎的版本
InnoDB存储引擎包含于所有的MySQL数据库的二进制发行版本中。早期其版本随着MySQL数据库的更新而更新。从5.1版本开始,MySQL数据库允许存储引擎开发商以动态方式加载引擎,这样存储引擎的更新可以不受数据库版本的限制。
所以在5.1中,可以支持两个版本的InnoDB,一个是静态编译的InnoDB版本,可以看成是老版本的InnoDB,另外一个是动态加载的版本,可以将其看成InnoDB1.0.x版本,官方称为InnoDB Plugin。
MySQL5.5版本中又将InnoDB的版本升级到了1.1.x。而后最近的MySQL5.6版本中,InnoDB的版本也随着升级为1.2.x版本。
由于不支持多回滚段,InnoDB Plugin支持的最大支持并发事务数量也被限制在了1023。
三、InnoDB体系架构
下图显示了InnoDB的存储引擎的体系结构,从图中可看出,InnoDB存储引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责如下工作:
- 维护所有进程/线程需要访问的多个内部数据结构
- 缓存磁盘上的数据,方便快速的读取,同时在对磁盘文件的数据修改之前在这里缓存。
- 重做日志(redo log)缓冲。
- …
后台线程的主要作用是负责刷新内存池中的数据,保证缓存池中的内存缓存的是最近的数据,此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能恢复到正常运行状态。
1、后台线程
InnoDB存储引擎是多线程的模型,因此其后台有多个不同的后台线程,负责处理不同的任务。
Master Thread(主要负责将缓存池数据刷新到磁盘)
Master Thread是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性。包括脏页的刷新、合并插入缓冲、UNDO页的回收等。
IO Thread(主要负责写IO请求的回调处理)
在InnoDB存储引擎中大量使用了AIO(Async IO)来处理写IO请求,这样可以极大提高数据库的性能。而IO Thread的工作主要是负责这些IO请求的回调处理。
在InnoDB1.0版本之前共有4个IO Thread,分别是write、read、insert buffer和log IO thread。在Linux平台下,IO Thread的数量不能进行调整,但是在Windows平台下,可以通过参数innodb_file_io_threads来增大IO Thread。从InnoDB1.0.x版本开始,read Thread和write Thread分别增大到了4个,并且不再使用innodb_file_io_threads参数,而是分别使用innodb_read_io_threads和innodb_write_io_threads参数进行设置,如: