1. Master Thread(老版本的基本逻辑,之后版本无非在此基础上做了一些细节调优,更加适应时代)
脏页刷新、合并插入缓冲、UNDO回收
每秒操作流程:
重做日志缓冲刷新到磁盘(记录操作)
合并插入缓冲
刷新100个脏页至磁盘(checkpoint)
如果当前没有用户活动,则切换到background loop
每十秒操作流程:
刷新脏页至磁盘
合并插入缓冲
重做日志缓冲刷新到磁盘
删除无用的undo页
2. IO Thread
使用AIO
3. Purge Thread
回收已经使用并分配的undo页
4. 缓冲池
结构:索引页、数据页、undo页、插入缓冲(insert buffer)、自适应hash索引、锁信息、数据字典信息
读: 缓冲池 -> 磁盘
写: 修改缓冲池 -> 以一定频率刷新脏页到磁盘上
缓冲池管理算法: LRU
5. 重做日志缓冲(持久性)
写:缓冲 -> 磁盘(重做日志文件)
时机:
Master Thread定时刷新
事务提交
日志缓冲池剩余空间小于50%
6. checkpoint
作用: 将缓冲池中的脏页刷到磁盘
时机:
Master Thread CheckPoint(以每秒/每十秒速度定时刷新一定比例,异步操作,用户操作线程不会被阻塞)
flush_lru_list checkpoint(LRU列表中需要一定数量的空闲页,当不够时会移除列表尾端页,如果存在脏页则需要checkpoint)
async/sync flush checkpoint(重做日志不可用的case:)
dirty page too much check point(脏页太多)
7. insert buffer
对于非聚集、非唯一的索引进行缓冲处理
写:先缓冲索引 -> 再刷新至磁盘
8. 聚集索引 + 辅助索引
聚集索引:按照主键构造的B+树,包行全部数据
辅助索引:叶子节点不包含行记录的全部数据,结构:key-value + 真实行数据标签