InnoDB存储引擎概述--概述

后台线程

作用

刷新内存池数据,保证内存缓存的是最新的数据,将已修改的数据文件刷新到磁盘中,数据库发生异常时InnoDB能恢复至正常运行状态.

Master Thread

负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新,合并插入缓冲,UNDO页的回收.

IO Thread

Async IO处理IO请求,四种Thread: write, read, insert buffer, log IO thread, 可设置: innodb_read_io_threads, innodb_write_io_threads

Purge Thread

来回收已经使用并分配的undo页.

Page Cleaner Thread

脏页刷新的操作放在该线程中执行.

内存

缓冲池

缓冲池大小可配: innodb_buffer_pool_size

缓冲池个数可配: innodb_buffer_pool_instances

LRU List, Free List, Flush List

改进LRU算法,该算法为midpoint insertion strategy,默认midpoint的位于列表的5/8处,该位置可以通过innodb_old_blocks_pct控制.

参数innodb_old_blocks_time表示页读取到mid位置后需要等待多久才会被加入到LRU的热端.

脏页既存在于LRU list, Flush list中,LUR列表是用来管理页列表的可用性,而Flush列表是用来管理将页刷新回磁盘,两者互不影响.

重做日志缓冲池:可配置参数innodb_log_buffer_size,默认为8MB,以下三种将缓存池内容刷新到磁盘中的情况:

1) Master Thread每一秒将重做日志缓冲刷新到重做日志中;

2) 每个事务提交时会将重做日志缓冲刷新到重做日志中;

3) 当重做日志缓冲池剩余空间小于1/2时,重做日志缓冲刷新到重做日志中.

Checkpoint技术

两种Checkpoint: Sharp Checkpoint(数据库关闭时将所有脏页刷新会磁盘), Fuzzy Checkpoint.

Fuzzy Checkpoint有以下几种:

Master Thread Checkpoint

FULSH_LRU_LIST Checkpoint

Async/Sync Flush Checkpoint

Dirty Page too much Checkpoint

Master Thread的工作方式

内部分为多个loop: loop, background loop, flush loop, suspend loop;

loop

每秒操作:

日志缓冲刷新到磁盘,即使这个事务还没有提交(总是);

合并插入缓冲(可能);

至多刷新100个脏页到磁盘(可能);

若当前无用户活动,切换到background loop.

每10秒操作:

刷新100个脏页到磁盘;(可能)

合并至多5个插入缓冲;(总是)

将日志缓冲刷新到磁盘;(总是)

删除无用的undo页;(总是)

刷新100个或10个脏页到磁盘(总是).

background loop

删除无用的undo页(总是);

合并20个插入缓冲(总是);

跳出主循环(总是);

不断刷新100个页直到符合条件(可能,跳转到flush loop完成).

1.2.x前增加可选项

innodb_io_capacity

innodb_max_dirty_pages_pct

innodb_adaptive_flushing

innodb_purge_batch_size

1.2.x后改进

Master Thread伪代码:

从Master Thread中分离出刷新脏页的操作至一个单独的Page Cleaner Thread.

InnoDB关键特性

Insert Buffer

适用对象:  非唯一的辅助索引

内部实现:  B+树

Insert/Change Buffer

Double Write

 

Adaptive Hash Index(AHI)

AHI有一个要求:对这个页的连续访问模式必须是一样的

Async IO

 

Flush Neighbor Page

 

posted @ 2018-04-03 09:25  清水捞蟹  阅读(141)  评论(0编辑  收藏  举报