MySQL内存(Buffer Pool)

devtools/2024/9/22 20:11:02/

Buffer Pool

MySQL 的数据存在磁盘,但是不能每次读取数据都从磁盘里去,这样磁盘IO太频繁,存在性能问题。
InnoDB设计了一个缓存池(Buffer Pool),缓冲池在内存中。
默认配置Buffer Pool大小为128MB,可以通过innodb_buffer_pool_size参数调整。一般调整为可用物理内存的60%~80%。

Buffer Pool缓存什么?

InnoDB会把存储的数据划分为若干,以页作为磁盘与内存的交互的基本单位,一个页默认大小为16KB,Buffer Pool中也是由构成。
Buffer Pool除了缓存索引页数据页,还包括undo页,插入缓存页、自适应哈希索引、锁信息等等。
在这里插入图片描述

Buffer Pool管理

InnoDB为每个缓存页都创建了一个控制块(类似于文件系统的PCB)

控制块信息包括:缓存页的表空间、页号、缓存页地址、链表节点等等

在这里插入图片描述

空闲页(Free 链表)

为了能够快速找到空闲的缓存页,可以使用链表结构,将空闲缓存页的控制块作为链表的节点,这个链表称为:Free 链表
在这里插入图片描述

脏页(Flush 链表)

与Free 链表类似
在这里插入图片描述

提高缓存命中率

使用简单的LRU算法会导致两个问题:

  • 预读失效
  • Buffer Pool污染

预读失效

  • MySQL有预读机制:
    MySQL在加载数据页时,会提前把它相邻的数据页一并加载进来,目的是较少磁盘IO。原理是程序具有空间局部性。
  • 预读失效:这些被提前加载进来的数据页,并没有被访问,相当于这个预读是白做了。这就是预读失效。
  • 解决:改进LRU算法,将LRU划分为2个区域:old 区 和 young区
    在这里插入图片描述
    预读的数据页放到old区,真正访问的也放到young区。如果预读也一直没被访问,就会从old区域移除。
    young被淘汰的页,会挤到old区的头部。

Buffer Pool 污染

当一个SQL语句扫描大量数据时,会把Buffer Pool的所有数据替换出去,导致大量热数据被淘汰了。
等这些热数据再次被访问时,就没有命中,再次进行磁盘IO,导致性能下降。

解决:
young区里是热数据,提高数据进入young的门槛,可以解决这个问题。
MySQL的解决方法:进入young区条件增加一个停留在old区域的时间判断。 具体如下:

  • 如果后续访问时间与第一次访问时间在某个时间间隔内,该缓存页就不会从old区进入young区。
  • 相反,该缓存页就会移动移动到young区头部。

这个间隔时间有innodb_old_blocks_time控制,默认为1s。

也就是说,只有同时满足[被访问]与 [在old区域停留时间超过1s] 这两个条件,才会被插入到young区头部

MySQL针对young区其实做了一个优化,为了防止young区域节点频繁移动到头部。young区前1/4被方位不会移动到链表头部,只有后3/4被访问才会。

脏页刷新时机

以下几种情况会触发脏页的刷新:

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

总结

在这里插入图片描述


http://www.ppmy.cn/devtools/115626.html

相关文章

LeetCode 每周算法 6(图论、回溯)

LeetCode 每周算法 6(图论、回溯) 图论算法: class Solution: def dfs(self, grid: List[List[str]], r: int, c: int) -> None: """ 深度优先搜索函数,用于遍历并标记与当前位置(r, c)相连的所有陆地&…

Redis 的三个并发问题及解决方案(面试题)

Redis 作为一种高性能的内存数据库,在很多应用场景中被广泛使用。然而,在并发环境下,Redis 可能会面临一些问题。本文将详细介绍 Redis 的三个常见并发问题,并提供相应的解决方案。 一、数据一致性问题 (一&#xff0…

网络协议全景:Linux环境下的TCP/IP、UDP

目录 1.UDP协议解析1.1.定义1.2.UDP报头1.3.特点1.4.缓冲区 2.TCP协议解析2.1.定义2.2.报头解析2.2.1.首部长度(4位)2.2.2.窗口大小2.2.3.确认应答机制2.2.4.6个标志位 2.3.超时重传机制2.4.三次握手四次挥手2.4.1.全/半连接队列2.4.2.listen2.4.3.TIME_…

django之中间件

Django 中间件是一个轻量级的、底层的插件系统,用于全局地处理请求和响应。中间件可以用于各种任务,如请求和响应的处理、用户认证、缓存、会话管理等。 Django 默认的中间件配置 在 settings.py 中,Django 默认的中间件配置如下&#xff1…

华为HarmonyOS地图服务 6 - 侦听事件来实现地图交互

本章节包含地图的点击和长按、相机移动(华为地图的移动是通过模拟相机移动的方式实现的)、以及“我的位置”按钮点击等事件侦听。 接口说明 以下是地图侦听事件相关接口,以下功能主要由MapComponentController提供,更多接口及使…

仿真软件PROTEUS DESIGN SUITE遇到的一些问题

仿真软件PROTEUS DESIGN SUITE遇到的一些问题 软件网上有很多下载地址自己找哈! 首先如果遇到仿真 没有库 ,需要在网上下载库文件替换到DATA目录下 如果不是默认安装到C盘需要手动修改这些地址,不然会报错!! 当遇到点击仿真出现报错 : 检查这个设置地址是否正确: 随便在库文…

JAVA基础:正则表达式,String的intern方法,StringBuilder可变字符串特点与应用,+连接字符串特点

1 String中的常用方法2 1.1 split方法 将字符串按照指定的内容进行分割,将分割成的每一个子部分组成一个数组 分割内容不会出现在数组中 实际上该方法不是按照指定的简单的符号进行分割的,而是按照正则表达式进行分割 1.2 正则表达式 用简单的符号组合…

AVL树与红黑树

目录 AVL树 AVL树节点的定义 AVL树的插入 AVL树的旋转 右单旋 左单旋 左右双旋 右左双旋 AVL树的验证 AVL树的性能 红黑树 红黑树的性质 红黑树节点的定义 红黑树结构 红黑树的插入操作 按照二叉搜索的树规则插入新节点 检测新节点插入后,红黑树的性…