Mysql InnoDB 结构

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 + 真实行数据标签

猜你喜欢

转载自blog.csdn.net/u011385186/article/details/84435018