InnoDB存储引擎的特点是:
行锁设计,支持MVCC,支持外键,提供一致性非锁定读,同时被设计成,最有效地利用及使用内存和CPU。
InnoDB体系架构包括:
1.后台线程
(1)Master Thread,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性。包括脏页的刷新,合并插入缓冲,UNDO页的回收。
每秒一次操作包括:
日志缓冲刷新到磁盘,即使这个事务还没有提交(总是)
合并插入缓冲(可能)
至多刷新100个脏页到磁盘(可能)
如果当前没有用户活动,则切换到backgroup loop(可能)
每10秒操作包括:
刷新100个脏页到磁盘(可能)
合并至多5个插入缓冲(总是)
将日志缓冲刷新到磁盘(总是)
删除无用的undo页(总是)
刷新100个或者10个脏页到磁盘(总是)
(2)I/O Thread,处理写IO请求, 线程包括 write, read, insert buffer, log IO Thread
(3)Purge Thread 事务被提交后,其所使用的undolog可能不在需要,因此需要purge Thread 来回收已经使用并分配的undo页
(4)Page Cleaner Thread,将之前版本中脏页的刷新操作都放入到单独的线程种完成。目的是减轻原有Master Thread的工作及对于用户查询线程阻塞
2.InnoDB存储引擎内存池
(1).缓冲池(innodb_buffer_pool_size),缓冲池的设计目的是为了协调CPU速度与磁盘速度的鸿沟,记录按页的方式进行管理。对于数据库中页的修改操作,首先修改在缓冲池中的页,然后再以一定的频率刷新到磁盘上,页从缓冲池刷新回磁盘的操作并不是在每次页发生更新是触发,而是一种通过称之为Checkpoint的机制刷新回到磁盘。
(2)缓冲池缓存的数据页类型有:索引页,数据页,undo页,插入缓冲,自适应哈希索引,InnoDB存储的锁信息,数据字典信息
(3)InnoDB1.0x版本开始,允许有多个缓冲池实例,每个页根据哈希值平均分配到不同缓冲池实例中。这样做的好处是减少数据库内部的资源竞争,增加数据库并发能力(innodb_buffer_pool_instance)
(4)LRU List, Free List, Flush List
LRU List:最频繁使用的页在LRU列表的前端。最少使用的页在LRU列表的末端。
Free List :当数据库刚启动时,LRU列表是空的,及没有任何的页,这时页都存放到Free列表。当需要从缓冲池中分页时,首先从Free列中查找是否有可用的空闲页,若有则将该页从Free中删除,放入到LRU列表中。否则根据LRU算法,淘汰LRU列表末尾的页
Flush List:脏页列表(update/delete/insert)
(5)重做日志缓冲
Master Thread 每秒将重做日志缓冲刷新到重做日志文件中
每个事务提交时会将重做日志缓冲刷新到重做日志文件
当重做日志缓冲池剩余空间小于1/2时,重做日志缓冲刷新到重做日志文件
3.文件
包括表空间文件(ibdata1)、表名.ibd、redo日志文件及各种日志文件
Checkpoint 技术
(1)作用:缩短数据库的恢复时间,缓冲池不够用时,将脏页刷新到磁盘,重做日志不可用时,刷新脏页
(2)当数据发生宕机时,数据库不需要重做所有的日志,因为Checkpoint之前的页都已经刷新回到磁盘。故数据库只需要对checkpoint后的重做日志进行恢复,这样缩短恢复时间。
(3)当缓冲池不够用的时候,根据LRU算法溢出最近最少使用的页,若此页为脏页,需要强制执行Checkpoint
(4)重做日志的设计都是循环使用的。并不是无限增大,当覆盖重做日志时,如果被覆盖的重做日志还需要使用,那么必须强制产生Checkpoint,将缓冲池中的页至少刷新到当前重做日志的位置
(5)对InnoDB而言,通过LSN(长序列号)来标记,即LSN之前不需要刷新到磁盘,LSN之后的时需要刷新到磁盘的
(6)Checkpoint触发条件
Sharp Checkpoint: 数据库关闭时将所有脏页都刷新回磁盘
Fuzzy Checkpoint: 部分脏页刷新
Master Thread Checkpoint
FLUSH_LRU_LIST Checkpoint
Async/Sync Flush Checkpoint
Dirty Page too much Checkpoint