二、InnoDB存储引擎
2.3 InnoDB体系架构
1)后台线程
Master Thread:核心线程,主要负责将缓冲池的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲、UNDO页的回收等。
IO Thread:处理IO请求
Purge Thread:事务被提交后,其所使用的 undolog 可能不再需要,因此需要 PurgeThread 来回收已经使用并分配的 undo页。
2)内存
缓冲池:简单来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。
- 读取:在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,这个过程称为将页 'FIX' 在缓冲池中。下一次再读相同的页时,首先判断该页是否在缓冲池中。若在,直接读取。否则,读取磁盘。
- 修改:首先修改缓冲池中的页,再以一定频率刷新到磁盘(checkPoint机制刷新到磁盘 checkpoint机制)
缓冲池管理:LRU(最近最少使用)算法来管理
重做日志缓冲:将重做日志信息放到这里,然后按一定频率将其刷新到重做日志文件。
2.6 InnoDB关键特性
1)插入缓冲
对于非聚集索引的插入或更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入;若不在,则先放入到一个 Insert Buffer
中,好似欺骗。
数据库这个非聚集的索引已经插到叶子节点,而实际并没有,只是存放在另一个位置。然后再以一定的频率和情况进行 Insert Buffer
和辅助索引页子节点的 merge(合并)
操作。这时通常能将多个插入合并到一个操作中(因为在一个索引页中),这就大大提高了对于非聚集索引插入的性能。
然而 Insert Buffer
的使用需要同时满足两个条件:
- 索引是辅助索引(secondary index)
- 索引不是唯一的
2)两次写
3)自适应哈希索引
InnoDB存储引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,称之为自适应哈希索引(adaptive hash index,AHI)。AHI是通过缓冲池的 B+树页构造而来,因此建立的速度很快,而且不需要对整张表构建哈希索引。InnoDB存储引擎会自动根据访问的频率和模式来自动地为某些热点页建立哈希索引。
AHI 有一个要求,即对这个页的连续访问模式必须是一样的。例如对于 (a,b) 这样的联合索引页,其访问模式可以是以下情况:
- where a=XX
- where a=XXX and b=XXX
访问模式一样指的是查询的条件一样,若交替进行上述两种查询,那么 InnoDB 存储引擎不会对该页构造 AHI。此外 AHI 还有如下的要求:
- 以该模式访问了100次
- 页通过该模式访问了N次,其中 N=页中记录*1 / 16
4)异步IO
用户可以在发出一个IO请求后立即再发出另一个IO请求,当全部IO请求发送完成后,等待所有IO操作的完成,这就是AIO。
5)刷新邻接页
:当刷新一个脏页时,InnoDB存储引擎会检测该页所在区(extent)的所有页,如果是脏页,那么一起进行刷新。
2.8 小结
本章对InnoDB存储引擎及其体系结构进行了概述,先给出了InnoDB存储引擎的历史、InnoDB存储引擎的体系结构(包括后台线程和内存结构):之后又详细介绍了InnoDB存储引擎的关键特性,这些特性使InnoDB存储引擎变得更具 '魅力';最后介绍了启动和关闭MySQL时一些配置文件参数对InnoDB存储引擎的影响。
通过本章的铺垫,读者在学习后面的内容时就会对InnoDB引擎理解得更深入和更全面。