线程:
Master Thread :脏页刷新,合并insert buffer,回收undo页
IO Thread:aio(async io), 处理aio的callback(比如io完成了该怎么做啊),分别有insert buffer thread(1),log thread(1),read thread(4),write thread(4)
purge thread:回收undo页(事务提交后,undo页不需要了),减轻Master Thread 压力
page cleaner thread:脏页刷新,减轻Master Thread 压力
内存:
1 缓冲池:innodb_buffer_pool (数据,索引,undo,insert buffer, adaptive hash index…),可有多个
通过lru列表管理:
考虑普通lru:一边进,一边出,中间的地方被访问就放到入口
innodb lru: 进口在midpoint处(3/8的位置靠出口处),为什么这么做?避免全表扫的时候所有数据都被刷出,如果这样的话,只有后面3/8的数据会被刷出,前面数据不变的。
所以前面5/8称为new列表(显然热点数据),后面3/8称为old列表,page_made_young(页由old加入new,页必须等待一定时间才能加入,innodb_old_blocks_time),page_not_made_young(页未能old加入new)
Lru列表是不断扩展的,(首先是空的,不断向Free 列表要内存,要不到了就淘汰尾端页)
页可压缩(16kb压为1,2,4,8),压缩页由unzip_lru列表管理
脏页同时存于lru列表和flush列表内,checkpoint机制刷回磁盘
2 重做日志缓冲 redo log buffer
master thread 每秒刷新到重做日志文件
事务提交时刷新
缓冲剩余空间小于一半时刷新
3 额外内存池(对某些数据结构本身的内存分配时从这里申请)
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。



