- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
图文16简单的LRU链表在BufferPool实际运行中,可能导致哪些问题?手机观看
578人次阅读2020-02-1109:03:06
详情评论
简单的LRU链表在BufferPool实际运行中,可能导致哪些问题?
如何提问:每篇文章都有评论区,大家可以尽情留言提问,我会逐一答疑
如何加群:购买狸猫技术窝专栏的小伙伴都可以加入狸猫技术交流群,一个非常纯粹的技术交流的地方
具体加群方式,请参见目录菜单下的文档:《MySQL专栏付费用户如何加群》(购买后可见)
1、简单回顾一下
之前我们讲解了BufferPool在使用过程中如果缓存页都使用了,没有空闲的缓存页时,可以去LRU链表中的尾部找一
个最近最少使用的缓存页,把他的数据刷入磁盘,腾出来一个空闲缓存页,然后加载需要的新的磁盘数据页到空闲缓
存页里去。
而LRU链表的机制也很简单,只要是刚从磁盘上加载数据到缓存页里去,这个缓存页就放入LRU链表的头部,后续如果
对任何一个缓存页访问了,也把缓存页从LRU链表中移动到头部去。
这样在LRU链表的尾部,一定是最近最少被访问的那个缓存页。
2、预读带来的一个巨大问题
但是这样的一个LRU机制在实际运行过程中,是会存在巨大的隐患的。
首先会带来隐患的就是MySQL的预读机制,这个所谓预读机制,说的就是当你从磁盘上加载一个数据页的时候,他可
能会连带着把这个数据页相邻的其他数据页,也加载到缓存里去!
举个例子,假设现在有两个空闲缓存页,然后在加载一个数据页的时候,连带着把他的一个相邻的数据页也加载到缓
存里去了,正好每个数据页放入一个空闲缓存页!
但是接下来呢,实际上只有一个缓存页是被访问了,另外一个通过预读机制加载的缓存页,其实并没有人访问,此时
这两个缓存页可都在LRU链表的前面,如下图。
我们可以看到,这个图里很清晰的表明了,前两个缓存页都是刚加载进来的,但是此时第二个缓存页是通过预读机制
捎带着加载进来的,他也放到了链表的前面,但是他实际没人访问他。
除了第二个缓存页之外,第一个缓存页,以及尾巴上两个缓存页,都是一直有人访问的那种缓存页,只不过上图代表
的是刚刚把头部两个缓存页加载进来的时候的一个LRU链表当时的情况。
这个时候,假如没有空闲缓存页了,那么此时要加载新的数据页了,是不是就要从LRU链表的尾部把所谓的“最近最
少使用的一个缓存页”给拿出来,刷入磁盘,然后腾出来一个空闲缓存页了?
这个时候,如果你把上图中LRU尾部的那个缓存页刷入磁盘然后清空,你觉得合理吗?他可是之前一直频繁被人访问
的啊!只不过在这一个瞬间,被新加载进来的两个缓存页给占据了LRU链表前面的位置,尤其是第二个缓存页,居然
还是通过预读机制加载进来的,根本就不会有人访问!
那么这个时候,你要是把LRU链表尾部的缓存页给刷入磁盘,这是绝对不合理的,最合理的反而是把上图中LRU链表的
第二个通过预读机制加载进来的缓存页给刷入磁盘和清空,毕竟他几乎是没什么人会访问的!
3、哪些情况下会触发MySQL的预读机制?
现在我们已经理解了预读机制一下子把相邻的数据页加载进缓存,放入LRU链表前面的隐患了,预读机制加载进来的
缓存页可能根本不会有人访问,结果他却放在了LRU链表的前面,此时可能会把LRU尾部的那些被频繁访问的缓存页刷
入磁盘中!
所以我们来看看,到底哪些情况下会触发MySQL的预读机制呢?
(1)有一个参数是innodb_read_ahead_threshold,他的默认值是56,意思就是如果顺序的访问了一个区里的多个
数据页,访问的数据页的数量超过了这个阈值,此时就会触发预读机制,把下一个相邻区中的所有数据页都加载到缓
存里去
(2)如果BufferPool里缓存了一个区里的13个连续的数据页,而且这些数据页都是比较频繁会被访问的,此时就会
直接触发预读机制,把这个区里的其他的数据页都加载到缓存里去
这个机制是通过参数innodb_random_read_ahead来控制的,他默认是OFF,也就是这个规则是关闭的
所以默认情况下,主要是第一个规则可能会触发预读机制,一下子把很多相邻区里的数据页加载到缓存里去,这些缓
存页如果一下子都放在LRU链表的前面,而且他们其实并没什么人会访问的话,那就会如上图,导致本来就在缓存里
的一些频繁被访问的缓存页在LRU链表的尾
您可能关注的文档
- 从0开始带你成为MySQL实战高手11 从数据的增删改开始讲起,回顾一下Buffer Pool在数据库里的地位.pdf
- 从0开始带你成为MySQL实战高手12 Buffer Pool这个内存数据结构到底长个什么样子.pdf
- 从0开始带你成为MySQL实战高手13 从磁盘读取数据页到Buffer Pool的时候,free链表有什么用.pdf
- 从0开始带你成为MySQL实战高手14 当我们更新Buffer Pool中的数据时,flush链表有什么用.pdf
- 从0开始带你成为MySQL实战高手15 当Buffer Pool中的缓存页不够的时候,如何基于LRU算法淘汰部分缓存.pdf
- 从0开始带你成为MySQL实战高手17 MySQL是如何基于冷热数据分离的方案,来优化LRU算法的.pdf
- 从0开始带你成为MySQL实战高手18 基于冷热数据分离方案优化后的LRU链表,是如何解决之前的问题的.pdf
- 从0开始带你成为MySQL实战高手19 MySQL是如何将LRU链表的使用性能优化到极致的.pdf
- 从0开始带你成为MySQL实战高手20 对于LRU链表中尾部的缓存页,是如何淘汰他们刷入磁盘的.pdf
- 2025年家居收纳用品行业分析报告.docx
文档评论(0)