MySQL内存(Buffer Pool)

news/2024/9/25 21:15:18/

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/news/1530448.html

相关文章

【Rust练习】16.模式

文章题目来自:https://practice-zh.course.rs/pattern-match/patterns.html 1 🌟🌟 使用 | 可以匹配多个值, 而使用 … 可以匹配一个闭区间的数值序列 fn main() {} fn match_number(n: i32) {match n {// 匹配一个单独的值1 > println!(…

关于有源蜂鸣器及无源蜂鸣器的区别及驱动各类单片机案例

关于有源蜂鸣器及无源蜂鸣器的区别及驱动各类单片机案例 有源蜂鸣器与无源蜂鸣器区别有源蜂鸣器无源蜂鸣器模块化有源蜂鸣器及无源蜂鸣器驱动方式的说明 有源、无源蜂鸣器代码驱动总结 有源蜂鸣器与无源蜂鸣器区别 有源蜂鸣器与无源蜂鸣器区别在于是否有振荡源。 有源蜂鸣器即…

sqoop的安装与简单使用

文章目录 一、安装1、上传,解压,重命名2、修改环境变量3、修改配置文件4、上传驱动包5、拷贝jar包 二、import命令1、将mysql的数据导入到hdfs上2、将mysql的数据导入到hive上3、增量导入数据 三、export命令1、从hdfs导出到mysql中2、从hive导出到mysql…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-24

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-24 1. Enriching Datasets with Demographics through Large Language Models: What’s in a Name? K AlNuaimi, G Marti, M Ravaut, A AlKetbi, A Henschel… - arXiv preprint arXiv …, 2024 通过大型语言…

【Linux基础IO】深入解析Linux基础IO缓冲区机制:提升文件操作效率的关键

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:Linux “ 登神长阶 ” 🤡往期回顾🤡:暂无 🌹🌹期待您的关注 🌹🌹 ❀Linux基础IO 📒1. 什么是缓…

k8s中,服务的自动注册、自动感知、负载均衡,三个功能的含义及测试验证

自动感知,指的是客户端只用访问服务的ip,而不用关心pod在哪个节点,以及pod的ip是多少。 服务可以自动感知pod的位置及ip,核心是通过selector标签选择器找到pod 自动注册,指的是服务创建之后,会自动在k8s的…

高效音频格式转换实战:使用Python和FFmpeg处理MP3到WAV的转换20240918

高效音频格式转换实战:使用Python和FFmpeg处理MP3到WAV的转换 引言 在现代音频处理工作中,音频文件格式的转换已成为日常操作之一。无论是为了兼容不同设备,还是进行更高质量的音频编辑,掌握如何快速、准确地转换音频格式是必不…

pg入门5—pg有哪些系统schema

在 PostgreSQL 中,除了用户创建的 schema 之外,系统还自动创建了一些系统 schema,用于管理数据库的元数据、系统信息以及维护操作。以下是 PostgreSQL 中的常见系统 schema: 1. pg_catalog 用途:pg_catalog 是 Postg…