mysql冷热数据LRU_浅析MySQL的lru链表

一、简述传统的lru链表

lru:least recently used

相信大家对lru链表是不陌生的,它算是一种基础的数据结构吧,而且想必面试时也被问到过什么是lru链表,甚至是让你手写一个lru链表。

想必你已经知道了mysql的buffer pool机制以及mysql组织数据的最小单位是数据页。并且你也知道了 数据页在buffer pool中是以lru链表的数据结构组织在一起的。

其实所谓的lru链表本质上就是一个双向循环链表,如下图:

54797a66d22d9023a2f60ba641962f82.png

下面我们结合lru链表和数据页机制描述一下mysql加载数据的机制:

我们将从磁盘中读取的数据页称为young page,young page会被直接放在链表的头部。已经存在于lru链表中数据页如果被使用到了,那么该数据页也被认为是young page而被移动到链表头部。这样链表尾部的数据就是最近最少使用的数据了,当buffer pool容量不足,或者后台线程主动刷新数据页时,就会优先刷新链表尾部的数据页。

二、传统lru链表的不足

相信你之前肯定听说过操作系统级别的空间局部性原理:

spatial locality(空间局部性):也就是说读取一个数据,在它周围内存地址存储的数据也很有可能被读取到,于是操作系统会帮你预读一部分数据。

mysql也是存在存在预读机制的!

当buffer pool中存储着一个区中13个连续的数据页时,你再去这个区里面读取,mysql就会将这个区里面所有的数据页都加载进buffer pool中的lru链表中。(然后可能你根本不会使用这些被预读的数据页)

当你顺序的访问了一个区中大于 innndb_read_ahead_threshold=56个数据页时,mysql会自动帮你将下一个相邻区中的数据页读入lru链表中。(这个机制默认是被关闭的)

当你执行select * from xxx;时,如果表中的数据页非常多,那这些数据页就会一一将buffer pool中的经常使用的缓存页挤下去,可能留在lru链表中的全部是你不经常使用的数据。

综上你可以看到,所谓的预读机制的优势,实际上违背了lru去实现将最近最少使用的数据页刷入磁盘的设计初衷。

三、mysql的lru链表

接下来我们看下mysql的buffer pool是如何定制lru链表的,已经lru帮innodb解决了什么问题。

当业务进行大量的crud时,需要不断的将数据页读取到buffer pool中的lru链表中。

mysql的lru链表长下面这样。

ff0500e0bdd6f2506099915a3ac058f8.png

lru链表被midpoint分成了new sublist和old sublist两部分。

其中new sublist大概占比5/8,old sublist占比3/8。

new sublist存储着young page,而old sublist存储着old page。

我们可以通过如下的方式查看midpoint的默认值。

4136b7e8799db75ecddf96bf4ebd6a11.png

用户可以根据自己的业务动态的调整这个参数!

这其实是一种冷热数据分离设计思想。他相对于传统的lru链表有很大的优势

四、mysql定制lru链表的优势

而对于mysqllru链表来说,通过midpoint将链表分成两部分。

从磁盘中新读出的数据会放在old sublist的头部。这样即使你真的使用select * from t;也不会导致new sublist中的经常被访问的数据页被刷入磁盘中。

正常情况下,访问old sublist中的缓存页,那么该缓存页会被提升到new sublist中成为热数据。

但是当你通过 select * from t 将一大批数据加载到old sublist时,然后在不到1s内你又访问了它,那在这段时间内被访问的缓存页并不会被提升为热数据。 这个1s由参数innodb_old_blocks_time控制。

另外:new sublist也是经过优化的,如果你访问的是new sublist的前1/4的数据,他是不会被移动到lru链表头部去的。

以上就是浅析mysql的lru链表的详细内容,更多关于mysql lru链表的资料请关注萬仟网其它相关文章!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

报应!GitHub上线围剿Python计划,已有4万人跟进,你呢?

人红是非多,最近Python就遇到了这样的问题。与国际技术社区上一片「形势大好」对比鲜明的是,国内技术圈却一直存在对Python,「力挺」和「吃瓜」两派阵营,针锋相对,最近就悄然上线一个争议性疑问:围剿Python…

生物智能与AI——关乎创造、关乎理解(上)

几百万年前,第一次人类智能的星火出现在非洲大陆,并且持续发展,最终在大约10万年前在智人的大脑中达到顶峰。作为现代人类,我们只能想象我们的古代祖先在窥视夜空时所经历的事情,以思考物理现实的本质,以及…

linux7基础——给用户添加sudo权限

文章目录1. 切换到超级用户2. 修改sudoers文件内容1. 切换到超级用户 命令:su 密码:******** 此处的密码是root用户的密码2. 修改sudoers文件内容 默认的sudoers文件不具有写权限 a) 给文件sudoers 增加write权限 命令: #chmod uw /etc/sud…

Spring Cloud Config 规范

Spring Cloud Config 规范 首先Spring Cloud 是基于 Spring 来扩展的,Spring 本身就提供当创建一个Bean时可从Environment 中将一些属性值通过Value的形式注入到业务代码中的能力。那Spring Cloud Config 要解决的问题就是: 如何将配置加载到 Environm…

RabbitMQ开机启动 Centos7环境

文章目录8.1. 创建启动脚本8.2. 赋予启动脚本可执行权限8.3. 加入开机启动并指定用户8.4. 赋予可执行权限8.5. 重启MQ服务器测试8.6. 查看MQ服务运行状态8.7. 浏览器验证MQ管控台8.1. 创建启动脚本 操作说明:使用fismq用户操作,使用root用户权限的地方我…

微信几亿人在线的点赞、取消点赞系统,用Redis如何实现?

戳蓝字“CSDN云计算”关注我们哦!作者 | solocoder责编 | 阿秃点赞功能大家都不会陌生,像微信这样的社交产品中都有,但别看功能小,想要做好需要考虑的东西还挺多的,如海量数据的分布式存储、分布式缓存、多IDC的数据一…

java 16进制数组 字符串_byte数组转换成16进制字符串和字符数组的方法

byte数组转换成16进制字符串String&#xff1a;public class CommonUtil {/*** byte数组转换成16进制字符串* param src* return*/public static String bytesToHexString(byte[] src){StringBuilder stringBuilder new StringBuilder();if (src null || src.length < 0) …

年度大盘点:机器学习开源项目及框架

我们先来看看Mybridge AI 中排名靠前的顶级开源项目&#xff0c;再聊聊机器学习今年都有哪些发展&#xff0c;最后探寻下新的一年中会有哪些有值得我们期待的事情。 顶级的开源项目 BERT BERT&#xff0c;全称为Bidirectional Encoder Representations from Transformers&am…

centos7以普通用户开机启动某个服务或者指定脚本

文章目录1. 执行命令格式规范2. 添加到/etc/rc.d/rc.local3. 赋予可执行权限扩展知识&#xff1a;开头添加这句 source /etc/profile 原因为 下面几点1. 执行命令格式规范 #开机切换到fismq用户执行/app/start.sh su fismq -c "/app/rabbitmq_server-3.8.3/sbin/start_ra…

Andrew Ng教你如何引领公司进入AI时代

AI&#xff08;人工智能&#xff09;技术就像100年前的电力一样&#xff0c;正准备改变每个行业。从现在到2030年&#xff0c;它将创造约13万亿美元的GDP增长。虽然它已经在谷歌&#xff0c;阿里巴巴&#xff0c;微软等领先的科技公司中创造了巨大的价值&#xff0c;但其他许多…

IBM Cloud Paks:云端追光者也!

作者&#xff1a;阿秃 现如今&#xff0c;“企业上云”已毫无争议。 据知名云管理服务商RightScale 发布的2019年全球云计算市场调查显示&#xff0c;在众多云平台中混合云的采用率比重最高&#xff0c;达到了惊人的58%。可以想见&#xff0c;市场对混合云的庞大需求正吸引越…

java 装配_Spring 通过Java代码装配bean

1. 背景尽管在很多场景下通过组件扫描和自动装配实现Spring的自动化扫描配置是更为推荐的方式&#xff0c;但在有些情况下自动化扫描的方案行不通&#xff0c;如想要将第三方库中的组件装配到自己的应用中。在这种情况下必须通过显示 装配的方式。显示装配有两种可选方案&#…

生物智能与AI——关乎创造、关乎理解(下)

无监督学习&#xff0c;迁移学习和工程设计 AI系统与人类学习之间的另一个主要差异在于AI系统所需的大量标记数据才可以达到人类级别的性能。例如&#xff0c;最近的语音识别系统在11940小时的语音训练后才能对齐转录。如果我们每天大声地听到另一个人类阅读文本两个小时&…

如何利用tcpdump抓包?

文章目录一、基本使用1. 安装tcpdump2. 使用方法二、案例实战2.1. 企业案例背景2.2. 抓包实战三、网卡接口获取3.1. centos7.x使用3.2. centos6.x使用一、基本使用 1. 安装tcpdump yum install tcpdump -y2. 使用方法 tcpdump -i 网卡接口 协议 -n 注&#xff1a;协议可以接…

Gartner 发布2019年超融合魔力象限:新增深信服一员!

近日&#xff0c;国际权威研究分析机构Gartner公布了2019全球《超融合基础设施魔力象限》报告。 报告显示国内仅有三家云计算厂商进入2019超融合基础设施魔力象限&#xff0c;分别是深信服、华为、华云数据。其中深信服超融合&#xff08;sangfor aCloud&#xff09;凭借技术优…

java对象组合_java并发编程(三): 对象的组合

对象的组合&#xff1a;如何将现有的线程安全组件&#xff0c;组合成我们想要的更大规模的程序。设计线程安全的类&#xff1a;设计线程安全类的三个要素&#xff1a;1.找出构成对象状态的所有变量&#xff1b;2.找出约束状态变量的不变性条件&#xff1b;3.建立对象状态的并发…

深度学习目标检测系列:一文弄懂YOLO算法|附Python源码

在之前的文章中&#xff0c;介绍了计算机视觉领域中目标检测的相关方法——RCNN系列算法原理&#xff0c;以及Faster RCNN的实现。这些算法面临的一个问题&#xff0c;不是端到端的模型&#xff0c;几个构件拼凑在一起组成整个检测系统&#xff0c;操作起来比较复杂&#xff0c…

Keepalived时主备负载均衡器都有VIP的问题:VRRP协议问题

文章目录一、企业案例背景二、异常现象三、分析结论解决思路3.1. 分析结论3.2. 解决思路四、SElinux 处理4.1. 查看SElinux的状态&#xff1a;4.2. 关闭SElinux五、Firewalld防火墙配置5.1. 开启vrrp 协议5.2. 重新启动防火墙5.3. 查看启动日志5.4. 虚拟ip验证5.5. 停止master节…

数据不足,如何进行迁移学习?

现在&#xff0c;人工智能的发展处于跳跃式阶段&#xff0c;我们也对AI在大型数据集的应用进展感到吃惊。更重要的是&#xff0c;那些我们没有跟踪的数十亿张照片或餐厅的评论并没有被遗漏掉&#xff1a;迁移学习技术让收集数据变得更加“容易”。另外&#xff0c;得益于PyTorc…

MongoDB+阿里云 最新数据库独家上线!

近日&#xff0c;开源数据库厂商MongoDB与阿里云在北京达成战略合作&#xff0c;作为合作的第一步&#xff0c;最新版MongoDB 4.2数据库产品正式上线阿里云平台。 目前阿里云成为全球唯一可提供最新版MongoDB服务的云厂商&#xff0c;双方合作打通了企业在云上使用最新版开源数…