- 1. InnoDB体系架构
- 1.1 后台线程
- 1.1.1 Master Thread
- 1.1.2 IO Thread
- 1.1.3 PurgeThread
- 1.1.4 Page Cleaner Thread
- 2.1 内存
- 2.1.1 缓冲池
- 2.1.2 缓冲池管理
- 2.1.3 重做日志缓冲
- 2.1.4 额外的内存池
- 2.2 Checkpoint技术
- 2.3 Master Thread 工作方式
- 2.4 InnoDB关键特性
- 2.4.1插入缓冲
- 2.4.2 两次写
- 2.4.3 自适应哈希索引
- 2.4.4 异步IO
- 2.4.5 刷新邻接页
1. InnoDB体系架构 1.1 后台线程 1.1.1 Master Thread
主要负责将缓冲池的数据异步刷新到磁盘
1.1.2 IO ThreadInnoDB大量使用AIO来处理IO请求,IO Thread主要负责IO请求的回调,在Linux平台下IO Tread数量不能进行调整,可以通过SHOW ENGINE INNODB STATUS来观察InnoDB中的IO Thread
Thread 0为insert buffer thread
Thread 1为log thread
后面是读写线程,可根据参数来进行修改且读线程id总小于写线程
此线程用于回收已经使用并分配的undo页,InnoDB 1.1 之前 purge操作在Master Thread中完成,为减轻Master Thread工作可将其独立出来从而提高CPU使用率。可添加如下指令来启用独立Purge Thread:
[mysqld]
innodb_purge_threads = 1
注:从InnoDB1.2版本开始,InnoDB支持多个Purge Thread
1.1.4 Page Cleaner Thread从InnoDB 1.2.x版本中引入,作用是将之前版本中脏页刷新操作放入单独线程来完成
2.1 内存 2.1.1 缓冲池缓冲池就是一块内存区域。InnoDB存储引擎是基于磁盘存储,利用内存的速度来起到缓冲的作用,提高数据库整体性能。
对数据库中页修改操作:先修改缓冲池中的页,然后以一定频率刷新到磁盘上
注:不是每次修改都进行刷新,是通过Checkpoint的机制刷新回磁盘
缓冲池大小直接影响数据库整体性能
通过innodb_buffer_pool_size设置大小
数据页和索引页占大部分。
从InnoDB 1.0.x开始,允许多个缓冲池实例,根据哈希值平均分配到不同缓冲池实例中,增加并发处理能力。
通过innodb_buffer_pool_instances来设置
数据库中缓冲池通过LRU来进行管理
LRU 最少使用算法,频繁使用在LRU列表前端,最少使用在LRU列表后端,当缓冲池无法存放新读取到的页的时候会先释放LRU列表尾端
Innodb 使用LRU,但对LRU做了一定优化:
LRU列表加入midpoint位置,新访问的页放入midpoint位置,mid默认LRU列表5/8处,由innodb_old_blocks_pct控制
innodb_old_blocks_pct = 37 ,尾部37%的位置(约3/8)
增加mid理由:
例如索引,或数据扫描等需要访问表中大部分页或者全部页,但这些页仅仅在这次查询操作中需要,为了不让这些页替换掉活跃的页,增加了mid
innodb_old_blocks_time 控制读取到mid位置后多少次加入到LRU列表的热端,这样尽可能使热点数据不会被刷出去。
Buffer pool size = Free buffers+ Database pages(表示LRU列表中页的数量) + 自适应哈希索引+Lock信息+Insert Buffer等页
pages made young 显示LRU列表中页移动到前端的次数
缓冲池命中率一般不小于95%,若小于95%可考虑是否由于全表扫描导致LRU列表被污染
SHOW ENGINE INNODB STATUS显示的是过去某个时间段
INNODB_BUFFER_PAGE_LRU观察LRU列表中每一个页的具体信息
非16KB页通过unzip_LRU列表来进行管理
脏页:缓冲池的页和磁盘的不一致,存在于LRU和Flush列表中,LRU列表用于管理缓冲池中页的可用性。Flush列表用来管理将页刷新回磁盘,两者互不干扰(脏页就是LRU中修改的页)
LRU参考:https://blog.51cto.com/u_15015155/2615502
Flush参考:https://blog.csdn.net/weixin_33365481/article/details/113458163
重做日志缓冲作一个中转的作用,不用太大,因为马上会被刷新到重做日志文件中
2.1.4 额外的内存池对一些数据结构本身的内存进行分配时,需要从额外的内存池中进行申请
2.2 Checkpoint技术checkpoint之前的日志被使用,checkpoint分为Sharp checkpoint和Fuzzy checkpoint
参考:https://www.cnblogs.com/wilburxu/p/8605641.html
具有最高优先级,由主循环,后台循环,刷新循环,暂停循环等组成



