innoDB的缓冲池(Buffer Pool)的工作原理

数据存在磁盘了,总不能次次和磁盘交互吧,所以innoDB有一个缓冲池(Buffer Pool),有了缓冲池后,读写就优先在缓冲池了。读先在缓冲池读,没有再去磁盘加载进缓冲池;写也是先写缓冲池,然后等后台线程去刷写磁盘。线程池默认128M,也可以自己设置。
在这里插入图片描述
我们知道数据基本读写单位是页,在缓冲区里也一样,也是按照页来分配的,叫缓存页(包括数据页、索引页、undo页等)。为了更好地管理这些页,MySQL设计了一个控制块来存储页的地址、页号等等,控制块也是占空间的,最后可能会有碎片空间,也就是控制块和缓存页中间的灰色区域。
在这里插入图片描述

如何管理缓冲池?

空闲页

用Free链表指向空闲的缓存页的控制块,之后有人要写就根据这个链表来找位置写,然后从链表中移除它。
在这里插入图片描述

脏页

如何修改sql数据?思路是不要改一个就写一次磁盘。用Flush链表记录脏页(被修改过的记录所在页),等后台线程来将脏页写入磁盘。
在这里插入图片描述
那什么时候刷写磁盘呢?万一还没来得及刷写MySQL就宕机了那不寄了
其实MySQL是用了一种Write Ahead Log 策略,即先写日志,再写入磁盘,通过 redo log 日志(mysql持久性的保证,undo log是原子性的保证)让 MySQL 拥有了崩溃恢复能力。
下面几种情况会触发脏页的刷新:

  • 当 redo log 日志满了的情况下,会主动触发脏页刷新到磁盘;
  • Buffer Pool 空间不足时,需要将一部分数据页淘汰掉,如果淘汰的是脏页,需要先将脏页同步到磁盘;
  • MySQL 认为空闲时,后台线程会定期将适量的脏页刷入到磁盘;
  • MySQL 正常关闭之前,会把所有的脏页刷入到磁盘;

提高缓存命中率

我们知道缓冲池的大小有限,所以肯定数据有出有进,因此我们要尽可能提升常用的数据在缓存中的 时间。因此设计了LRU链表(Least Recently Used),也就是说新用到的缓存页放到表头,表尾自动移除一个页,但涉及了两个问题需要解决。

预读失效

程序局部性,即加载一个地方的数据,会一次性连带加载其附近的数据,本质上是好的,因为很大概率相近位置的数据会在相近时刻被用到。
但假设没用到呢?也就是说我白干了,这就是预读失效。
这就寄了,不用的数据被预读到链表头部,反而先前用过的数据(可能还会再用的)被挤到尾部甚至移除了。
MySQL的思路是划分young和old区域
在这里插入图片描述
新加入的页20放到old里在这里插入图片描述
假设页20又被访问了,才会放到young里
在这里插入图片描述

Buffer Pool污染

假设一条sql语句会导致大量数据页被加载进来,就很可能把buffer空间顶满了,之前的数据(很可能是大量的热数据)都会被顶出去,young区间也不例外。
怎么解决?
其实这些被大量读入的数据页很可能就会被用到一次,那只访问一次时候不让它进入young区域而是记录下访问页的时间,假设在某个时间范围内重复读取,那就不算是热数据(一页里多个数据行被反复用到,之后就没被用到了),那数据页还是在old里;假设在某个时间范围外都被重复读取了,那就证明有多条语句对这部分数据有需求,那就是热数据,这才会被从old移动到young里。时间默认是1s。
实际上MySQL还对young做了个优化,为防止young区域频繁出现头部节点变更,young里前1/4的页被访问了不会移动到头部,后3/4才会。

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

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

相关文章

CSGO搬砖干货,全网最详细教学!

CSGO游戏搬砖全套操作流程及注意事项(第一课) 在电竞游戏中,CSGO(Counter-Strike: Global Offensive)被广大玩家誉为经典之作。然而,除了在游戏中展现个人实力和团队合作外,有些玩家还将CSGO作为…

git 更换远程仓库地址三种方法总结分享

因为公司更改了 gitlab 的网段地址,发现全部项目都需要重新更改远程仓库的地址了,所以做了个记录,说不定以后还会用到呢。 一、不删除远程仓库修改(最方便) # 查看远端地址 git remote -v # 查看远端仓库名 git rem…

Java开源ETL工具-Kettle

一、背景 公司有个基于Kettle二次开发产品主要定位是做一些数据ETL的工作, 所谓的ETL就是针对数据进行抽取、转换以及加载的过程,说白了就是怎么对原始数据进行清洗,最后拿到我们需要的、符合规范的、有价值的数据进行存储或者分析的过程。 一般处理ETL的…

Ubuntu18 Opencv3.4.12 viz 3D显示安装、编译、使用、移植

Opencv3.*主模块默认包括两个3D库 calib3d用于相机校准和三维重建 ,viz用于三维图像显示,其中viz是cmake选配。 参考: https://docs.opencv.org/3.4.12/index.html 下载linux版本的源码 sources。 查看cmake apt list --installed | grep…

代码随想录算法训练营Day 60 || 84.柱状图中最大的矩形

84.柱状图中最大的矩形 力扣题目链接(opens new window) 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 1 < heights.length <10^50 < hei…

数据库实验三 Sql多表查询和视图

数据库实验三 Sql多表查询和视图 一、Sql表二、在线练习 一、Sql表 www.db-book.com 二、在线练习 对所有表执行查询语句&#xff0c;查看有哪些数据。 select * from tableName; 一、执行以下查询语句&#xff0c;写出查询意图。 (1) select * from student,takes whe…

YOLOv7独家改进: Inner-IoU基于辅助边框的IoU损失,高效结合 GIoU, DIoU, CIoU,SIoU 等 | 2023.11

💡💡💡本文独家改进:Inner-IoU引入尺度因子 ratio 控制辅助边框的尺度大小用于计算损失,并与现有的基于 IoU ( GIoU, DIoU, CIoU,SIoU )损失进行有效结合 推荐指数:5颗星 新颖指数:5颗星 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c …

Redis -- 介绍

1、NoSQL: 指的是非关系型数据库&#xff0c;主要分成四大类&#xff1a;键值存储数据库、列存储数据库、文档型数据库、图形数据库。 2、什么是Redis&#xff1a; Redis是一种基于内存的数据库&#xff0c;一般用于做缓存的中间件。 3、Redis的主要的特点&#xff1a; 1、Rd…

投标文件如何写【格式层面】

一、顶级标题的修改&#xff08;1级标题的修改&#xff09; 修改的内容&#xff0c;核心是样式多级序号&#xff1b; 样式解决&#xff1b;标题1&#xff0c;标题2&#xff0c;解决快速排版的问题 多级标号解决如1.1,1.2.1,1.3.4等类似的自动编号的规划设置&#xff0c;如果…

Oracle-客户端连接报错ORA-12545问题

问题背景: 用户在客户端服务器通过sqlplus通过scan ip登陆访问数据库时&#xff0c;偶尔会出现连接报错ORA-12545: Connect failed because target host or object does not exist的情况。 问题分析&#xff1a; 首先&#xff0c;登陆到连接有问题的客户端数据库上&#xff0c;…

【实用】PPT没几页内存很大怎么解决

PPT页数很少但导出内存很大解决方法 1.打开ppt点击左上角 “文件”—“选项” 2.对话框选择 “常规与保存” &#xff08;1&#xff09;如果想要文件特别小时可 取消勾选 “将字体嵌入文件” &#xff08;2&#xff09;文件大小适中 可选择第一个选项 “仅最入文档中所用的字…

Java大型电商项目——品优购(一)

视频教程&#xff1a;【黑马程序员】Java大型电商项目—品优购【配套源码笔记】_哔哩哔哩_bilibili源码下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1fECz5In_XCB-aW6ed6ZTbA 提取码&#xff1a;27xa 技术选型&#xff1a; 后端框架&#xff1a;SpringSprin…