Mysql Innodb的内存管理的组成:

Mysql Innodb存储引擎内存管理

1.Buffer Pool:预分配的内存池

2.Page:Buffer Pool的最小单位

3.Free List:空闲Page组成的链表

4.Flush List: 脏页链表

5.Page hash表:维护内存Page和磁盘文件Page的映射关系

6.LRU:内存淘汰算法(LRU链表分为LRU_new和LRU_old,new热数据占总链表的八分之五,old冷数据占八分之三,通过Midpoint标识来分割)

 

一、Innodb页面加载流程与淘汰

1.磁盘数据加载到内存;

2.在Page hash表写入映射关系;

3.从空闲链表中取出空闲页,链入LRU_old的头部;如果没有空闲页,从LRU中尾部进行淘汰,先将LRU的尾页删除然后将该空白页加入到空闲链表,然后从空闲链表取出载入数据,放入LRU列表;如果LRU被锁就从Flush List链表中取脏页进行淘汰。(可参考文章的首图)

 

二、LRU数据位置移动

冷数据old到热数据new:mysql的config中有innodb_old_blocks_time,old区存活时间,只有大于此值,才有机会进去new区。

热数据new到冷数据old:并不是数据进行换区,而是分区的Midpoint指针进行移动,指针一直保持在5/8的位置。

 

三、LRU_new区内的操作

LRU数据在移动的过程中其实是在对内存就行修改,会触发锁(lock),触发锁就会降低并发,所以要减少数据的移动。

mysql的策略是:根据两个参数,freed_page_clock (Buffer_Pool中淘汰的页数)、LRU_new链表长度的1/4。

计算公式:

    freed_page_clock - 此数据页上次移动到Header时的freed_page_clock > LRU_new链表长度的1/4

如果条件成立,那么就对此数据页就移动至header,否则不动。

 

相关文章: