趣说 Mysql内存篇 Buffer Pool

news2024/11/29 8:55:14

讲解顺序

先说 Mysql InnoDB 内存结构

  1. Buffer Pool
  2. Page 管理机制
  3. Change Buffer
  4. Log Buffer

Buffer Pool

接上回 说到了 LRU 算法对内存的数据 进行淘汰

LRU 算法本身是 最近最少使用的,但是这样就会出现 分不清楚 哪些是真正多次使用的数据

LRU缺点:

  1. 如果发生全表扫描,会把表中的所有页加载到内存,会将真正需要缓存的热数据 淘汰掉
  2. Mysql 中存在预读机制,很多预读的页放到LRU的头部,如果这些预读没有得到应用,就会导致真正的热数据被淘汰了 所以需要对LRU 算法进行改进

看到这里 我有几个疑问

思考:为什么 热/冷数据 占比是 63%,37%呢? 不能每个一半么?为什么这么设计啊?ist

肯定从官网下手了,

刚开始查询 “innoD lru” 本来以为 能有类似的吧。。。结果很尴尬,不给力啊,看来要换个方向 查询了, 这个 63 37 是配置出来的,对应参数是什么呢?

热数据部分(young区域)和冷数据部分(old区域)。每个部分所占的比例可以通过innodb_old_blocks_pct参数来指定,默认为37,意思是冷数据占比37%。实际上数据第一次被加载到缓存的时候是放在冷数据区链表的头部。当被加载到冷数据区的头部之后经过指定的时间后被访问了的数据就会被移动到热数据区的链表头部。这个指定时间是通过innodb_old_blocks_time指定的,默认为1000ms也就是1秒。

什么? 你问我 是不是百度出来的,没错,我是百度的,但是你也可以自己去找啊。。。

毕竟还是本地查找比较快,我一般是 本地查找

简单来说就是 innodb_old_blocks_pct 指定用于old的InnoDB缓冲池的大约百分比,代表着 冷数据默认是 37%。取值范围为5 ~ 95。默认值为37(即池的3/8)。常和 innodb_old_blocks_time 一起使用。

看到这,又想想 innodb_old_blocks_time 干什么的啊。。。

innodb_old_blocks_time 就是 多长时间的数据 能从 冷数据区 转移到 热数据区,默认值 1000ms 1s

你说这么说,还是没有说明白,为什么冷数据 37% 啊,嗯嗯,是的,其实这个问题,一想就知道 肯定是官方当时 做的基准测试,得出的结论,而且也给我们留了口子,行吧 不细研究了。

自己想想也是,热数据肯定要大点,然后冷数据每次淘汰到 只剩5% 才能进入热数据,具体为什么,看了github 、 官网 是没有找到,先放放

冷数据区的数据页什么时候被转到热数据区?

  1. 该页在LRU链表中 存在时间超过1s,就被移动到链表的头部,如果没到1s,保持其位置不动

innodb_old_blocks_time 就是那个时间限制,

说实话 其实 我看到 young、old的定义的时候 ,我最开始想到的是jvm的 年轻代和 老年代old区,我本来以为是 先放到 young 区 然后通过几次刷,才会到old。但是mysql 这块是反的,从磁盘查询上来的数据 优先放在了old区,后面真正被访问到时才将其挪入到young区链表头部,将young区数据页淘汰的放入old区头部。预读的数据后面如果一直没有被访问,优先淘汰old区的数据页,因此不会影响young区的热点数据。

jvm 和 mysql

其实 jvm 和 mysql 都一样,只是叫法不一样

jvm 和 mysql的区别在于,jvm 是希望把经常使用的数据 放到 old区,之后 old区实在放不下才会gc,一般不gc,而mysql 希望把经常使用的数据 放到 young 热数据区,但是热数据区也有正常的淘汰机制,每次希望old区有 5%的数据进入到 young区 进行替换,让young 一直保持 热数据。。。概念一样,场景不同而已

思考:超过1s了 冷数据就被 移动到热数据的头部了?

首先想想 如果放到头部,会有什么后果?

属于 新来的和尚会念经?你刚从冷数据区 过来,可能 我本身是 元老了(真正的经常使用的数据)

这不行啊,只能让你 从冷数据区,慢慢的往热数据的头 移动,属于排名了,按照访问量

这块你可能想说,那不对啊,你说按照访问量 排序,那可能我先调用一个数据页(A数据页)的查询 1000次,但是过期了,后面来一个真正的查询数据页(B数据页),怎么我也到不到老大的位置啊。。。。坑

但是 请注意 这是 lru,经常用的数据 会移动到头部的,所以上面说的情况不存在,哈哈,皮

热数据区 难道每次访问我都需要移动point 么?

不,我不想,能省一步 是一步啊,不要瞎搞

  1. 如果热数据链表前25%(1/4)的缓存页被访问,他们是不会被移动的
  2. 只有在后75%(3/4)中的缓存页被访问,才会移动到表头,这样就能尽可能的减少链表中节点的移动,从而减小性能的损耗

LRU列表中有一个Midpoint的位置,新读取到的数据页并不是直接放入到LRU列表的首部,而是放入到LRU列表的Midpoint位置,这个操作称之为Midpoint insertion stategy,也叫中间点插入策略

这就涉及 热数据的淘汰是怎么做的?

MySQL的预读机制

每16kb为一页,连续64个页就是一个区,默认占用1MB,每256个区被划分成一个组。

上面LRU 缺点第二点说到了 预读机制,有两点

  1. 如果内存中 有同一个区中的多个数据页,默认是56个,就会把下一个区中所有的数据页都加载到缓存页里,通过参数innodb_read_ahead_threshold控制,默认是56。
  2. 如果 缓存了一个区的13个连续数据页,就会触发预读机制,把这个区里的页全都加载到缓存页里。通过参数innodb_random_read_ahead控制,默认是off

思考: 这两个参数怎么看,我现在默认是什么啊?

思考: mysql 那么多默认参数,默认值是放在哪里的啊?

在 my.cnf 或者 my.ini中

实际开发中的联想

说了这么多理论,没什么用。这些东西在实际开发中能用上什么呢?

我主要是 写中间件的时候 关于内存的时候 用上了,其实之前学mysql的时候 模仿这个 结构自己写过一个demo ,后面直接用的 哈哈

还有wal 想保证数据落到磁盘,不过实际开发中 还是用文件 bak 比较多 哈哈

总结

mysql InnoDB buffer Pool 到这就简单结束了

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

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

相关文章

软考重点10 知识产权

软考重点10 知识产权一、著作权1. 著作权的理解(1)版权:(2)人身权与财产权2. 知识产权的归属判定3. 知识产权的归属判定(1)委托创作(2)合作开发4. 著作权保护对象及范围5…

为什么要有包装类,顺便说一说基本数据类型、包装类、String类该如何转换?

一、前言 开门见山,首先看看八种基本数据类型对应的包装类: 基本数据类型包装类charCharacterbyteByteshortShortintIntegerlongLongfloatFloatdoubleDoublebooleanBoolean 其中Character 、Boolean的父类是Object,其余的父类是Number 二、装…

【软件测试】毕业打工两年,辞职一年后转行月薪18K,软件测试让我发起了第一春......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 小徐: 毕…

C++ 类和对象 日期类的实现

作者:小萌新 专栏:初阶C 作者简介:大二学生 希望能和大家一起进步 本篇博客目标: 完成Date类的实现 梳理剩下两个默认函数 好困 跑个步去 睡醒啦! 继续肝 日期类的实现本章目标一. 日期类的实现1.1 Getmonthday的实现…

CNN的实现与可视化

CNN的实现 我们已经实现了卷积层和池化层,现在来组合这些层,搭建进行手写数字识别的CNN。如下图所示,网络的构成是“Convolution - ReLU - Pooling -Affine - ReLU - Affine - Softmax”,我们将它实现为名为SimpleConvNet的类。 …

R语言—向量

向量&#xff08;vector&#xff09; R 语言最基本的数据结构是向量。类似于数学上的集合的概念&#xff0c;由一个或多个元素构成。向量其实是用于存储数值型、字符型、或逻辑型数据的一维数组。 创建向量 c()函数 > a <- 1 #给a赋值1 > a #显示a的值 [1] 1 …

【C++初阶】类和对象终极篇

文章目录一.加const修饰this指针二.cout<<自定义类型的对象的实现1.深入理解cout和<<2流插入和流提取3.友元函数的来源a.作为ostream成员函数b.作为全局函数c.作为Date类的成员函数d.作为Date类的友元函数三.再谈构造函数之初始化列表四.隐式类型转换&explicit…

Linux命令从入门到实战----文件目录类

文章目录pwd显示当前工作路径的绝对路径ls列出目录的内容cd切换目录mkdir 创建一个新的目录删除一个空的目录touch创建新文件cp复制文件或目rm删除文件或目录mv移动文件与目录&#xff0c;重命名文件cat查看文件内容&#xff0c;创建新文件more文件内容分屏查看less分屏显示文件…

【C语言】字符串、字符数组

目录 写在开头 正文 一、字符串的本质 二、输入函数scanf和gets 三、输出函数printf和puts 四、字符串的长度——strlen 五、字符串的复制——strcpy 六、字符串的比较函数 七、实战练习 八、二维字符数组——字符串数组 写在最后 写在开头 看了标题&#xff0c;是…

Kotlin编程实战——类与对象(05)

一 概述 类与继承属性和字段接口(interface )函数式&#xff08;SAM&#xff09;接口可见性修饰符扩展数据类(data class)密封类泛型嵌套类与内部类枚举类对象表达式与对象声明类型别名内联类(inline class)委托委托属性 二 类与继承 类继承(open override )抽象类(abstract)…

MySQL去重中 distinct 和 group by 的区别

今天在写业务需要对数据库重复字段进行去重时&#xff0c;因为是去重&#xff0c;首先想到的是distinct关键字。于是一小时过去了。。。。&#xff08;菜鸟一个&#xff0c;大家轻点骂&#xff09; 我把问题的过程用sql语句演示给大家演示一下 首先我使用的是mybatis-plus&am…

数据结构之哈希表

文章目录 一、概念二、哈希冲突三、如何解决哈希冲突&#xff1f; 1.哈希函数设计2.负载因子调节3.闭散列4.开散列&#xff08;哈希桶&#xff09;四、模拟实现哈希桶总结一、概念 顺序结构以及平衡树中&#xff0c;元素与其存储位置之间没有对应的关系&#xff0c;因此在查找一…

C++多态学习笔记

C多态学习笔记一、多态概述二、多态的作用三、多态发生的三个条件四、多态实现的原理五、接口的定义六、模板方法模式七、虚析构函数和纯虚析构函数7.1 虚析构函数7.2 纯虚析构函数八、重写重载重定义九、父类引用子类对象一、多态概述 同一个操作作用于不同的对象&#xff0c;…

2014年848数据结构真题复习

求k频度K0; for&#xff08;i1;i<n;i&#xff09; 假如是1——8&#xff0c;执行了9次&#xff0c;8次有效&#xff0c;最后一次无效for&#xff08;ji;j<n;j&#xff09;k 我的理解&#xff1a;假设n为8我们看k频度实际上就是看内圈for的有效循环次数第一轮是1——8 八次…

基础算法 第七课——归并排序

文章目录导言归并排序的概念步骤说明逐步分析STEP1STEP2STEP3STEP4STEP5STEP6STEP0总结导言 这&#xff0c;是一篇现学现卖的文章。因为&#xff0c;我根本没学过归并排序。所以&#xff0c;这篇文章&#xff0c;绝对能让您学懂归并。如果不懂&#xff0c;那我就再学一遍&…

KVM Forum 2022应该关注的话题

1. QEMU 和 KVM 自动性能基准测试 QEMU & KVM Automated Performance Benchmarking SUSE - Dario Faggioli, SUSE SUSE正在开发一个框架&#xff0c;用于对虚拟化工作负载进行自动性能基准测试。它是围绕着MMTests&#xff08;已经在Linux内核社区使用了几年&#xff09;建…

2022-Java 后端工程师面试指南 -(SSM)

前言 种一棵树最好的时间是十年前&#xff0c;其次是现在 Tips 面试指南系列&#xff0c;很多情况下不会去深挖细节&#xff0c;是小六六以被面试者的角色去回顾知识的一种方式&#xff0c;所以我默认大部分的东西&#xff0c;作为面试官的你&#xff0c;肯定是懂的。 上面的…

Mybatis之foreach

文章目录一、foreach属性二、使用foreach批量删除(法一)1.接口2.mapper文件3.测试类4.运行结果三、使用foreach批量删除(法二)1.mapper文件四、使用foreach批量插入1.接口2.mapper文件3.测试类4.运行结果一、foreach属性 collection&#xff1a;指定数组或者集合 item&#xf…

FPGA时序约束01——基本概念

前言1. 越来越多的时序问题 随着FPGA时钟频率加快与其实现的逻辑功能越来越复杂&#xff0c;开发者遇到的问题很多时候不再是代码逻辑的问题&#xff0c;而是时序问题。一些开发者可能有这样的经历&#xff0c;一个模块在100MHz时钟运行没问题&#xff0c;而将时钟频率改为150…

【仿牛客网笔记】 Spring Boot进阶,开发社区核心功能-事务管理

添加评论中会用到事务管理。 解决的程度不同&#xff0c;层级不同。我们一般选择中间的级别。 选择时既能满足业务的需要&#xff0c;又能保证业务的安全性&#xff0c;在这样的前提下我们追求一个更高的性能。 第一类丢失更新 图中是没有事务隔离的情况 第二类丢失更新 脏…