文章目录
体系架构
后台线程
1.master Thread
2.IO Thread
write read insertBuffer LogIO
3.Purge Thread:可以单独开一个处理undoLog
4.Page Cleaner Thread,处理脏页(在LRU中修改后被换出的,需要将内容写到磁盘上)的刷新
内存
1.缓冲池
innodb是基于磁盘存储的,按照页的方式进行管理,基于磁盘。
实用缓存的机制加快速度,先查缓冲池,再查硬盘;不在缓冲池读完放进缓冲池;
修改时先看是否在内存中,在的话直接修改,利用checkpoint机制刷新到磁盘。
2.LRU FREE FLUSH
LRU:最近最少使用,最频繁的在LRU的前端,最少使用的在尾部。
定义midpoint点3/8位置,一般新读取的放在midpoint处。保护热点数据,防止扫描或索引影响效率;全表扫描引起LRU污染.
定义old_block_time,代表加入多长时间后才能被加入顶端.
加入顶端make young,因为oldBlockTime不能放入顶端叫cant make young
Free list:空闲页都放在freelist中,当需要从缓冲池分页的时候先查询freelist,若没有空闲就页面置换,一般一页16k
unzip_LRU处理压缩页表
FlushLIst:
FlushList即脏页列表,脏页既存在于LRU也存在于FlushList,两者不影响.
FlushList负责页刷新会磁盘.
3.重做日志缓冲
负责缓冲重做日志,并刷新到日志文件
4.额外的内存池
Innodb对内存用heap管理,当对一些数据结构进行内存分配时首先从额外内存池中申请,若不足 则去缓冲池中申请.
Checkpoint技术
事务提交时,先写undo log,再修改页.出现故障也能通过日志恢复, ACID中的D,持久性.
缓冲池不够用时,若换出的为脏页,则强制执行checkpoint
Ma:每秒刷新一定的脏页到磁盘
FL:5.6之前,保证空闲页数量 ,page clean
As:一般定义一个区间达到区间就执行checkpoint , page clean
Di:脏页达到一定数量
Master Thread的工作方式
- 5.6之前:循环执行
插入缓冲Insert Buffer
对非聚集不唯一索引假装插入,每隔一段时间进行合并,避免多次查询索引位置.
Change Buffer
Merge BUffer
两次写
自适应哈希
异步IO
AIO: