mysql原理三:mysql引擎InnoDB内存和磁盘架构

mysql的InnoDB引擎的内存和磁盘架构如下图所示: 

内存区域中,有缓存池Buffer Pool,其结构如下图所示:

 free链表为空闲链表,保存了buffer pool中的空闲的内存空间,一个控制块对应于一个空白块,大小为一个也的大小,默认为16kb。

当执行一个update语句后,会先更新buffer pool中的数据页,而该页变为脏页,如下图:

 对于脏页,有一个flush链表控制:

 当buffer pool空间满时,需要淘汰内存块,以放入新数据页,而实现淘汰策略,有个一lru链表:

 lru链表中数据块,最近越使用的越靠前,淘汰时从链表末尾进行淘汰。

考虑如下sql:
 

select * from t1;

这是一个全表扫描sql,那么扫描到的数据会放到buffer pool,如果数据量很大,会把buffer pool中的数据全部淘汰掉,这样就会有一个问题,把访问很频繁的数据淘汰掉。为了解决这个问题,lru链表实际上是这样的:

lru链表分两部分:热数据区(占5/8)和冷数据区(占3/8),这里的热数据和冷数据和常规理解的不太一样:冷数据第一次被访问的时间为t1,第二次被访问的时间为t2,t2-t1>1秒钟,则把该数据从冷数据区移到热数据。注意: 这里是t2-t1>1秒,而不是t2-t1<1秒,这么做是为了解决上边那种全表扫描把buffer pool中有价值的数据淘汰掉的问题。当全表扫描时,数据是顺序访问的,一条接一条,那么同一页被先后访问到的时间间隔就很小,不会超过1秒,因此根据t2-t1>1秒才把冷数据移到热数据的规则,全表扫描时,不会把buffer pool中有价值的数据替换掉。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值