当前位置: 首页 > news >正文

(七)MySQL是如何将LRU链表的使用性能优化到极致的?

(一)大白话MySQL执行SQL的流程

(二)大白话InnoDB存储引擎的架构设计

(三)大白话MySQL Binlog是什么?

(四)MySQL的Buffer Pool内存结构

(五)MySQL的Buffer Pool的free链表、flush链表、LRU链表

(六)MySQL是如何基于冷热数据分离的方案,来优化LRU算法?

(七)MySQL是如何将LRU链表的使用性能优化到极致的?

文章目录

    • 1、LRU链表的热数据区域是如何进行优化的?
    • 2、定时把LRU尾部的部分缓存页刷入磁盘
    • 3、把flush链表中的一些缓存页定时刷入磁盘
    • 4、实在没有空闲缓存页了怎么办?

1、LRU链表的热数据区域是如何进行优化的?

接着我们来看看LRU链表的热数据区域的一个性能优化的点,就是说,在热数据区域中,如果你访问了一个缓存页,是不是应该要把他立马移动到热数据区域的链表头部去?
在这里插入图片描述
但是你要知道,热数据区域里的缓存页可能是经常被访问的,所以这么频繁的进行移动是不是性能也并不是太好?也没这个必要。

所以说,LRU链表的热数据区域的访问规则被优化了一下,即你只有在热数据区域的后3/4部分的缓存页被访问了,才会给你移动到链表头部去

如果你是热数据区域的前面1/4的缓存页被访问,他是不会移动到链表头部去的。

举个例子,假设热数据区域的链表里有100个缓存页,那么排在前面的25个缓存页,他即使被访问了,也不会移动到链表头部去的。但是对于排在后面的75个缓存页,他只要被访问,就会移动到链表头部去。

这样的话,他就可以尽可能的减少链表中的节点移动了。

2、定时把LRU尾部的部分缓存页刷入磁盘

我们已经知道,他是根据LRU链表去淘汰缓存页的,那么他到底是什么时候把LRU链表的冷数据区域中的缓存页刷入磁盘的呢?实际上他有几个时机。

首先第一个时机,并不是在缓存页满的时候,才会挑选LRU冷数据区域尾部的几个缓存页刷入磁盘,而是有一个后台线程,他会运行一个定时任务,这个定时任务每隔一段时间就会把LRU链表的冷数据区域的尾部的一些缓存页,刷入磁盘里去,清空这几个缓存页,把他们加入回free链表去

所以实际上在缓存页没用完的时候,可能就会清空一些缓存页了,我们看下面的图示。
在这里插入图片描述

所以大家会发现,只要有这个后台线程定时运行,可能你的缓存页都没用完呢,人家就给你把一批冷数据的缓存页刷入磁盘,清空出来一批缓存页,那么你就多了一批可以使用的空闲缓存页了!

所以如果在一个动态的运行效果中思考,大概就是你不停的加载数据到一些空闲的缓存页里去,然后这些缓存页可能被使用,会在lru链表中各种移动。然后同时有一个后台线程还不停的把冷数据区域的一些不用的缓存页刷入磁盘中,清空一些缓存页出来。

只要有缓存页被刷人磁盘,大家可以想象一下,那么这个缓存页必然会加入到free链表中,从flush链表中移除,从lru链表中移除。

3、把flush链表中的一些缓存页定时刷入磁盘

如果仅仅是把LRU链表中的冷数据区域的缓存页刷入磁盘,大家觉得够吗?

明显不够啊,因为在lru链表的热数据区域里的很多缓存页可能也会被频繁的修改,难道他们永远都不刷入磁盘中了吗

所以这个后台线程同时也会在MySQL不怎么繁忙的时候,找个时间把flush链表中的缓存页都刷入磁盘中,这样被你修改过的数据,迟早都会刷入磁盘的!

只要flush链表中的一波缓存页被刷入了磁盘,那么这些缓存页也会从flush链表和lru链表中移除,然后加入到free链表中去!

所以你可以理解为,你一边不停的加载数据到缓存页里去,不停的查询和修改缓存数据,然后free链表中的缓存页不停的在减少,flush链表中的缓存页不停的在增加,lru链表中的缓存页不停的在增加和移动。

另外一边,你的后台线程不停的在把lru链表的冷数据区域的缓存页以及flush链表的缓存页,刷入磁盘中来清空缓存页,然后flush链表和lru链表中的缓存页在减少,free链表中的缓存页在增加。

这就是一个动态运行起来的效果!

4、实在没有空闲缓存页了怎么办?

此时可能所有的free链表都被使用了,然后flush链表中有一大堆被修改过的缓存页,lru链表中有一大堆的缓存页,根据冷热数据进行了分离,大致是如此的效果。

这个时候如果要从磁盘加载数据页到一个空闲缓存页中,此时就会从LRU链表的冷数据区域的尾部找到一个缓存页,他一定是最不经常使用的缓存页!然后把他刷入磁盘和清空,然后把数据页加载到这个腾出来的空闲缓存页里去!

这就是MySQL的Buffer Pool缓存机制的一整套运行原理!我们已经完整的讲完了缓存页的加载和使用,以及free链表、flush链表、lru链表是怎么使用的,包括缓存页是如何刷入磁盘腾出来空闲缓存页的,以及缓存页没有空闲的时候应该怎么处理。

大家首先理解了最近几篇文章之后,就应该完全理解了,MySQL在执行CRUD操作的时候,是如何尽可能基于内存中的缓存来处理的。

相关文章:

  • MySql(28)InnoDB和MyISAM索引对比
  • 【数据库系统概论】实验四 数据编辑及查询
  • windows 驱动与内核调试 学习
  • F450无人机组装与调试
  • Dubbo:@DubboService和@Service、@DubboReference和@Reference的区别和关系
  • Vue2:使用Vant UI实现网易云评论页上拉和下拉刷新
  • 公众号查题接口系统调用
  • 用servlet写一个hello word
  • myj的补作业计划HrbustOJ新生赛(struct+优先队列)
  • canal的入门与使用
  • 病毒营销增长策略:Facebook和 Airbnb的5个病毒传播方法
  • C++:特殊类设计
  • Spring如何记忆
  • 材料科学基础学习指导-吕宇鹏-名词和术语解释-第二章晶体缺陷
  • 线段树2----简单拓展
  • 《Java编程思想》读书笔记-对象导论
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 2017 年终总结 —— 在路上
  • Docker入门(二) - Dockerfile
  • EOS是什么
  • JavaScript DOM 10 - 滚动
  • Joomla 2.x, 3.x useful code cheatsheet
  • Python_OOP
  • Spring框架之我见(三)——IOC、AOP
  • spring学习第二天
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 力扣(LeetCode)22
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 思维导图—你不知道的JavaScript中卷
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 国内开源镜像站点
  • 正则表达式-基础知识Review
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • ###C语言程序设计-----C语言学习(3)#
  • #大学#套接字
  • #每日一题合集#牛客JZ23-JZ33
  • %@ page import=%的用法
  • %check_box% in rails :coditions={:has_many , :through}
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (剑指Offer)面试题34:丑数
  • (力扣)1314.矩阵区域和
  • (五)MySQL的备份及恢复
  • (五)网络优化与超参数选择--九五小庞
  • (一)UDP基本编程步骤
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • . NET自动找可写目录
  • .net CHARTING图表控件下载地址