2.1InnoDB引擎概述
完整支持ACID事务,行锁设计,支持MVCC,支持外键,提供一致性非锁定读。
2.2InnoDB存储引擎的版本
版本 | 功能 |
老版本InnoDB(mysql5.1静态编译的InnoDB版本) | 支持ACID,行锁设计,MVCC |
InnoDB 1.0.x (mysql5.1动态编译的InnoDB版本,官方称InnoDB Plugin) | 继承了上述版本所有功能,增加了compress和dynamic页格式 注:由于不支持多回滚段,最大支持并发事务数量限制在1023 |
InnoDB 1.1.x (mysql5.5版本) | 继承了上述版本所有功能,增加了LinuxAIO,多回滚段 |
InnoDB 1.2.x (mysql5.6版本) | 继承了上述版本所有功能,增加了全文索引支持,在线索引添加 |
2.3InnoDB体系架构
2.3.1后台线程
InnoDB引擎有多个线程负责处理不同的任务。
1Master Thread(核心):负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新,合并插入缓冲(INSERT BUFFER),UNDO页的回收等。
2IO Thread
InnoDB引擎使用AIO处理IO请求
InnoDB 1.0版本之前共有4个IO Thread,分别是write,read,insert buffer和log。在linux平台,io thread数量不能调整,windows平台下可以通过参数innodb_file_io_threads来增大IO Thread。从InnoDB 1.0.x开始,read thread和write thread分别增大到了4个,并且不再使用innodb_file_io_threads参数,而是分别使用innodb_read_io_threads和innodb_write_io_threads参数设置
可以通过命令show engine innodb status来观察InnoDB中的IO Thread:
3Purge Thread
事务提交后,其所使用的undolog可能不再需要,此时需要Purge Thread来回收已经使用并分配的undo页。在InnoDB 1.1版本之前,purge操作仅在InnoDB存储引擎的Master Thread中完成,从InnoDB 1.1版本开始,purge操作可以独立出单独的线程。
可在配置文件中添加如下命令来启用独立的Purge Thread
注:InnoDB1.1版本只能设置为1,InnoDB1.2支持多个Purge Thread
4Page Cleaner Thread
在InnoDB 1.2.x 版本引入,作用是将之前版本中脏页的刷新操作都放入到单独的线程中来完成。减轻原Master Thread的工作及对于用户查询线程的阻塞,进一步提高InnoDB存储引擎的性能。
2.3.2内存
1缓冲池
InnoDB存储引擎是基于磁盘存储的,其中的记录按照页的方式管理。由于cpu速度和磁盘速度之间的鸿沟,基于磁盘的数据库系统通常使用缓冲池技术来提高数据库的整体性能。
读取数据库的页:首先将从磁盘读到的页放在缓冲池中,下次再读取页时先从缓冲池读。
修改数据库中的页:首先修改在缓冲池中的页,然后再以一定的频率(checkpoint机制)刷新到磁盘上。
综上,缓冲池大小直接影响着数据库的整体性能。在32位操作系统最多将该值设置为3G。
2LRU List,Free List,Flush List
3重做日志缓冲
4额外的内存池