MySQL基于冷热数据分离优化的LRU刷盘策略

前言

对于计算机刷盘这个概念相信大家都非常熟悉了,刷盘策略,其实在操作系统层面来说的话就是页面置换算法。

不知道各位朋友们还记得页面置换算法有哪些吗?

  1. FIFO(先进先出算法)
  2. OPT(最佳置换算法)
  3. LRU(最近最少使用算法)
  4. CLock(时钟置换算法)
  5. LFU(最不常用算法)
  6. MFU(最常使用算法)

因为MySQL中刷盘使用的是LRU算法,所以本文重点讲述LRU。。

LRU和LFU的区别

在正式开始MySQL刷盘策略讲解之前,有一点必须要和大家一起回顾的。

LRU算法和LFU算法是两回事:

  1. LRU算法(最近最少使用),强调的是最后一次使用的时间与当前启动刷盘的时间之间的间隔
  2. LFU算法(最不经常使用),强调的是在刷盘前的一段时间内使用的次数最少

简单的LRU刷盘策略

什么是LRU算法:

简单点来说就是,有维持一条链表,每访问一个数据页就将其移动到表头,这样在链表尾的就一直是当前时刻的最近最少使用的页面。


这样子,有什么缺点吗?

其实本来这算法已经挺好的了,主要思想是在缓存页不够的时候,挑最近最少使用的数据页进行刷盘以释放该缓存页,但是——

问题就出现在MySQL是一个庞大而复杂的系统,简单点来说,它并没有这么简单。

主要问题有两个:

  1. MySQL的预读机制,导致“间接被访问”的数据页也被加到了链表头
  2. MySQL走全表扫描的时候,会将大量页面移动到链表头

MySQL的预读机制就类似于局部性原理,你访问了数据页1 系统会认为你很有可能要访问数据页2,所以自动帮你加载进了内存。

全表扫描的话,肯定也是要将磁盘中的数据页加载进内存的。

因为这两个问题的存在,会导致原本经常访问的数据页被预读(或者全表扫描)进来的数据页挤到了链表尾,最终被淘汰掉

这是一个很大的影响性能的问题。

基于冷热数据分离优化

在这种情况下,我们将数据划分为两大类:一类是热数据,一类是冷数据。

热数据部分是实际需要访问的,而冷数据部分就是MySQL预读机制顺带的,或者是全表扫描的。

在这里插入图片描述

到了这里,相信各位朋友可能会有些疑惑:冷数据究竟什么时候才可以移动到热数据区呢?因为冷数据区是在LRU链表的末尾,所以肯定是先淘汰的冷数据区的数据页。

其实这个是有一定讲究的,你们想想假如刚从磁盘加载进来的时候,就立即访问了,那么这个时候是不是应该将冷数据移动到热数据区呢?

万一只是刚刚访问一次呢?之后都不访问了?比如全表扫描,一般都是扫描过后就不再访问了的。

那这样岂不是又出现问题了!

所以——

冷数据移动到热数据区的时机:

在冷数据被从磁盘加载到内存中,1s后还被访问这才会将该冷数据移动到热数据区。

为什么是1s之后呢?

因为全表扫描1次访问中1s已经可以完成了,只有1s之后还继续被访问到这才说明该数据页是热数据。

++++

在文章的最后,我再设问一句:热数据区内,是所有被访问的数据都需要移动到链表头吗?

其实热数据区比较靠前的哪些数据都是经常需要访问的,没必要每次都移动到链表头。

要知道链表结点的移动也是设计到性能消耗的,可以说能不动就不动。

为此,MySQL中采取的方案是:

将热数据也分为两部分,前四分之一是一部分,后四分之三是另一部分;只有访问后四份之三的时候才会将该数据页移动到链表头。

嘿嘿,各位朋友们,咱们今天的学习就到此结束了,为每一个坚持学习下来的你们点赞!

文末我再问一个问题:热数据区的数据不是所有都需要移动到链表头的,那么冷数据呢?访问冷数据是不是一定要将数据移动到冷数据区的最前面呢?

们,咱们今天的学习就到此结束了,为每一个坚持学习下来的你们点赞!

文末我再问一个问题:热数据区的数据不是所有都需要移动到链表头的,那么冷数据呢?访问冷数据是不是一定要将数据移动到冷数据区的最前面呢?

欢迎评论区讨论~

MySQL基于冷热数据分离优化的LRU刷盘策略相关推荐

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

    (一)大白话MySQL执行SQL的流程 (二)大白话InnoDB存储引擎的架构设计 (三)大白话MySQL Binlog是什么? (四)MySQL的Buffer Pool内存结构 (五)MySQL的B ...

  2. Alluxio基于冷热数据分离的元数据管理策略

    文章目录 前言 Alluxio内部元数据管理架构 Alluxio的支持异步写出功能的自定义Cache实现 引用 前言 上篇文章末尾,笔者聊到了一种叫做分层元数据管理模式.它主张的思想是将元数据进行分级 ...

  3. mysql 冷热数据分离_elasticsearch冷热数据读写分离

    Elasticsearch5.5冷热数据读写分离 前言 冷数据索引:查询频率低,基本无写入,一般为当天或最近2天以前的数据索引 热数据索引:查询频率高,写入压力大,一般为当天数据索引 当前系统日志每日 ...

  4. 文件服务器冷热数据划分,游戏服务器冷热数据分离方案

    冷热数据分离 当前场景: gamserver启动时,会将所有数据加载到内存中,提高读取数据的性能.但是有很多数据很可能是不常用甚至再也用不到的数据,将这些数据加载到内存中需要占用更多的内存,极大的浪费 ...

  5. 关于redis的冷热数据分离

    一.概述 当前KV数据库从存储介质可以分为两种模式,一种是以内存为主持久化为辅,如memcache(无持久化).redis等:一种是以持久化为主内存为辅,如ssdb(基于leveldb/rocksdb ...

  6. 云上如何做冷热数据分离

    目录(?)[-] 前言 如何区分冷热数据 冷数据的特点 冷数据的处理 场景一极低频度的查询 冷数据备份 使用冷数据 场景二需要经常查询 方案一冷热RDS 方案二冷数据转存RDS PostgreSQL版 ...

  7. Shopee ClickHouse 冷热数据分离存储架构与实践

    本文首发于微信公众号"Shopee技术团队". 摘要 Shopee ClickHouse 是一款基于开源数据库 ClickHouse 做二次开发.架构演进的高可用分布式分析型数据库 ...

  8. mysql部署策略_MySQL延迟问题和数据刷盘策略流程分析

    一.MySQL复制流程 官方文档流程如下: MySQL延迟问题和数据刷盘策略 1.绝对的延时,相对的同步 2.纯写操作,线上标准配置下,从库压力大于主库,最起码从库有relaylog的写入. 二.My ...

  9. mysql数据刷盘过程详解_MySQL延迟问题和数据刷盘策略流程分析

    一.MySQL复制流程 官方文档流程如下: MySQL延迟问题和数据刷盘策略 1.绝对的延时,相对的同步 2.纯写操作,线上标准配置下,从库压力大于主库,最起码从库有relaylog的写入. 二.My ...

最新文章

  1. oracle备库重启后失去连接,关于dataguard备库宕机后重启后的问题
  2. 安卓恶意软件Skygofree爆发,连你的照片都能监控到
  3. HDU 5608 function(莫比乌斯反演 + 杜教筛)题解
  4. How to improve software performance with NEON
  5. wine 运行QQ的问题
  6. linux pe ef 详解,PE工具列表(看雪學院)
  7. kx linux驱动下载,KX-MB2138CN Linux
  8. 程序员常用英文名参考
  9. Tableau可视化---Tableau简介
  10. window+mysql+免安装_mysql 5.7.18 免安装版window配置方法
  11. html5点击刷新的效果,HTML5 手机屏幕下拉(下刷)动作的弹性刷新效果
  12. 低代码接口开发平台——YesApi(免费注册)
  13. [蓝桥杯]蓝肽子序列(c++详解)
  14. String 转表情, Swift 与 OC 中调用
  15. Android插件化-Activity篇,腾讯安卓开发面试
  16. 杂项-职位-软件测试工程师:软件测试工程师
  17. 入门oracleDBA面试题
  18. python离线安装第三方包
  19. 云计算的云是指什么?最简单的解释是什么?
  20. 图书借阅java设计报告_JAVA课程设计报告图书借阅系统.pdf

热门文章

  1. 读书笔记——弗洛伊德《梦的解析》
  2. 711便利店算法java_G711算法学习
  3. excel,从两列中筛选重复数据
  4. left join 基本用法
  5. 酒店女继承人抨击酒店时弊
  6. Multisim 7位数码管
  7. 服务器中间件版本信息泄露,中间件版本信息泄露漏洞
  8. 查看dll文件的内容
  9. AD20 PCB后期处理
  10. opencv3.4.1: ippicv_2017u3_lnx_intel64_20170822.tgz下载包