时间:2021-07-01 10:21:17 帮助过:12人阅读
redo log先都写入该buffer,而后按一定频率刷新到磁盘(1s/次),默认8M。其刷到磁盘主要一下几个情况:
对一些数据结构本身的内存分配是从额外内存池分配。
负责将缓存池中的数据异步刷新到磁盘,包括脏页。合并插入缓存(INSERT BUFFER)、UNDO页的回收等。
Innodb中大量使用AIO处理写请求,IO Thread则主要处理这些请求的回调,包括write、read、insert buffer和log IO Thread。
主要用来回收undo log,Innodb1.1之前由Master Thread负责。
清理已提交事物的UNDO log。
事务型数据库一般采用Write Ahead Log策略,当事物提交时先写redo log而后修改内存中的页。当数据库宕机对于还未写入磁盘的修改数据可以通过redo log恢复。Checkpoint作用在于保证该点之前的所有修改的页均已刷新到磁盘,这之前的redo log在恢复数据时可以不需要了。
发生在数据库关闭时,将所有脏页写入磁盘,数据库运行时一般不使用。
只刷新部分部分脏页。
主要包括主loop、background loop、flush loop和suspend loop。其中的参数可以配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
while ( true ){
//差不多1s一次
for ( int i in 0..9){
刷新日志缓存到磁盘
//1s内的统计值
if IO < 5
合并插入缓存
if 脏页比例 > 预定值
刷新部分脏页(不超过100)
if 没有用户活动
进入background loop{
删除无用undo页
合并20个插入缓冲
可能跳到flush loop{
可能跳到suspend loop
}
跳回主loop
}
sleep 1s;
}
//差不多10s一次
if IO < 200 //10s内
刷新100个脏页到磁盘
合并最多5个插入缓冲
刷新日志缓冲
删除无用undo
刷新100或10个脏页
}
|
Master Thread中的脏页刷新功能完全由Page Cleaner Thread执行。
+ View Code
在对脏页刷新到磁盘时,如果某一页还没写完就宕机,此时该页数据已经混乱无法通过redo实现恢复。innodb提供了doublewrite机制,其刷新脏页步骤如下:
1. 先将脏页数据复制到doublewrite buffer中(2MB内存) 2. 将doublewrite buffer分两次,每次1MB写入到doublewrite磁盘(2MB)中。 3. 马上同步脏页数据到磁盘。对于数据混乱的页则可以从doublewrite中读取到,该页写到共享表空间。
InnoDB存储引擎会监控对表上索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以称之为自适应(adaptive) 的。自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快。而且不需要将整个表都建哈希索引,InnoDB存储引擎会自动根据访问的频率和模式 来为某些页建立哈希索引。
linux和windows中提供异步IO,其可以对连续的页做合并连续页的IO操作使随机IO变顺序IO。
刷新页时判断相邻页是否也是脏页。
Mysql Innodb体系结构
标签:linu 异步 ble lru 自动 体系 while htm 过程