【MySQL 数据宝典】【内存结构】- 001 BufferPool

一、 BufferPool

BufferPool 官方文档地址

1.1 什么是 Buffer Pool

Buffer Pool 概述: Buffer Pool 是 InnoDB 存储引擎用于缓存磁盘中页的内存区域,它的大小直接影响数据库的性能。

默认大小和调整:

  • 默认情况下,Buffer Pool 的大小为 128MB,但可以根据服务器配置和需求进行调整。
  • 通过设置 MySQL 服务器配置文件中的 innodb_buffer_pool_size 参数来指定 Buffer Pool 的大小。

配置示例:

  • 举例:如果服务器有 512GB 内存,可以将数百GB分配给 Buffer Pool,以提高数据库读取性能。
  • 可在配置文件中设置 innodb_buffer_pool_size 参数,单位为字节。例如:
[server]
innodb_buffer_pool_size = 268435456

SHOW VARIABLES LIKE 'innodb_buffer_pool_size%';

[server]
innodb_buffer_pool_size = 51539607552
单位是字节
KB:51539607552 / 1024 = 50331648 KB
MB:51539607552 / (1024 * 1024) = 49152 MB
GB:51539607552 / (1024 * 1024 * 1024) = 48 GB
可以看到我们生产上使用了 48G 的 BufferPool ,当前机器规格是 32C64G

最小值限制:

  • Buffer Pool 的最小值为 5MB,如果设置的值小于 5MB,则会自动调整为 5MB。

注意事项:

  • 在配置 Buffer Pool 大小时,需要根据服务器内存资源和数据库性能需求进行权衡,以达到最佳性能和资源利用效率。

1.2 内部组成

imgimg

Buffer Pool :

  • 作用: 缓冲池,简称BP。其作用是用来缓存表数据与索引数据,减少磁盘IO操作,提升效率

  • 内存结构: 控制块+碎片+缓存页

    • 控制块被存放到 Buffer Pool 的前边,用于管理每个缓存页的控制信息。

    • 缓存页被存放到 Buffer Pool 的后边,用于存储实际的数据页内容。

  • 缓存页大小: 默认情况下,Buffer Pool 中的缓存页大小和磁盘上默认的页大小都是 16KB。

  • 控制块:

    • 存储内容: 存储着对应缓存页的所属的 表空间编号+页号+缓存页在 Buffer Pool 中的地址+链表节点信息+锁信息 等待

    • 内存大小: 每个缓存页对应的控制信息占用的内存大小是相同的,因此我们将每个页对应的控制信息称为一个控制块。控制块和缓存页是一一对应的关系。

  • 碎片: 每一个控制块都对应一个缓存页,那在分配 足够多的控制块和缓存页后,可能剩余的那点儿空间不够一对控制块和缓存页的大小,用不到了。当然,如果你把 Buffer Pool 的大小设置的刚刚好的话,也可能不会产生 碎片

注:Buffer Pool大小为128M指的就是缓存页的大小,控制块则一般占5%,所以每次会多申请6M的内存空间用于存放控制块

1.3 缓存页的哈希处理

在 InnoDB 存储引擎中,Buffer Pool 是用于缓存磁盘中页的内存区域,它的管理对数据库的性能至关重要。

Buffer Pool 管理问题

  • Buffer Pool 中的缓存页是用于存储磁盘中页的数据,但如何快速确定某个页是否已经在 Buffer Pool 中呢?
  • 传统的方法是遍历 Buffer Pool 中的所有缓存页,这样效率较低,尤其是在大型数据库系统中。

哈希表的应用

  • 哈希表结构: 我们可以利用哈希表来解决这个问题。将表空间号和页号作为键,缓存页作为值,创建一个哈希表。

  • 快速查找: 当需要访问某个页的数据时,我们可以通过哈希表快速查找对应的缓存页,而无需遍历整个 Buffer Pool。

  • 存在缓存页: 如果哈希表中存在对应的缓存页,则直接使用该缓存页中的数据,无需加载磁盘数据。

  • 不存在缓存页: 如果哈希表中不存在对应的缓存页,说明该页尚未加载到 Buffer Pool 中。此时,可以从 free 链表中选择一个空闲的缓存页,然后将磁盘中对应的页加载到该缓存页的位置。

  • Key: 表空间号+数据页号

  • Value: 对应的控制块

需要访问某个页的数据时,先从哈希表查询,如果不存在,就从 free 链表中选出一个空闲的缓冲页,把磁盘的页加载到缓冲页的位置

在 MySQL 中,确定一条数据的表空间号(tablespace ID)和页号(page number)通常是由 InnoDB 存储引擎来处理的。InnoDB 存储引擎使用了一种称为聚簇索引(clustered index)的结构来组织表中的数据,其中每个表都有一个主键索引(或称聚簇索引),主键索引的叶子节点就是数据页。

下面是确定一条数据的表空间号和页号的一般过程:

  1. 索引访问: 如果查询使用了主键或者唯一索引,那么 InnoDB 存储引擎可以直接定位到相应的数据页,跳过后续步骤。
  2. 二级索引访问: 如果查询使用了非主键索引,则首先通过非主键索引找到对应的主键值。
  3. 根据主键值查找数据: 使用主键值在主键索引上进行查找,定位到相应的数据页。
  4. 页号和表空间号: 一旦找到了数据页,InnoDB 可以从页头信息中提取表空间号和页号。通常,页头信息中包含了页号和表空间号,InnoDB 可以直接获取这些信息以确定数据的位置。

1.4 多个 Buffer Pool

img

Buffer Pool 实例化

Buffer Pool 是InnoDB向操作系统申请的一块连续的内存空间,用于缓存数据库页。在多线程环境下,访问Buffer Pool中的各种链表需要加锁处理。当Buffer Pool特别大且多线程并发访问量很高时,单一的Buffer Pool可能会影响请求处理速度。因此,我们可以将Buffer Pool拆分成若干个小的Buffer Pool实例,每个实例独立申请内存空间、管理链表等,以提高并发处理能力。

配置实例数

在服务器启动时,可以通过设置innodb_buffer_pool_instances参数来指定Buffer Pool实例的个数。例如:

[server]
innodb_buffer_pool_instances = 8

我们生产上就使用了 8个 Buffer Pool 实例,其中每个实例都是独立的,互不影响。每个Buffer Pool实例占用的内存空间可以通过以下公式计算:
innodb_buffer_pool_size / innodb_buffer_pool_instances

即总共的Buffer Pool大小除以实例的个数,得到每个实例占用的大小。

注意事项

  • innodb_buffer_pool_size的值小于1GB时,设置多个实例是无效的,InnoDB会将innodb_buffer_pool_instances的值修改为1。
  • 在Buffer Pool大小等于或大于1GB时,建议设置多个Buffer Pool实例。

通过以上方式,可以根据系统负载和并发访问情况,灵活配置Buffer Pool实例,提高数据库的并发处理能力。

1.5 Buffer Pool Chunk

在MySQL 5.7.5之后,支持在服务器运行期间调整Buffer Pool大小,但是重新调整Buffer Pool大小会耗费大量时间,因为需要重新向操作系统申请内存空间并复制数据。

为了解决这个问题,MySQL引入了Buffer Pool Chunk的概念。一个Buffer Pool实例由若干个chunk组成,每个chunk代表一片连续的内存空间,包含缓存页与其对应的控制块。

img

特点

  • 动态调整:在服务器运行期间可以以chunk为单位增加或减少内存空间,无需重新申请一大片内存并复制数据。
  • 参数设置:通过启动参数innodb_buffer_pool_chunk_size指定每个chunk的大小,默认为128M。
  • 注意事项:无法在服务器运行期间修改innodb_buffer_pool_chunk_size,因为重新调整chunk大小会耗费大量时间。

为什么不能动态修改chunk大小?

修改innodb_buffer_pool_chunk_size会导致重新申请内存空间并复制数据,耗费大量时间。而且每个chunk的大小会比设置值大约5%,以确保有足够的内存空间存储缓存页与其对应的控制块。

通过Buffer Pool Chunk的机制,MySQL在运行期间可以更加灵活地调整Buffer Pool的大小,提高了性能和效率。

关于InnoDB Buffer Pool的配置规则

  • 规则概述

  • innodb_buffer_pool_size必须是innodb_buffer_pool_chunk_size × innodb_buffer_pool_instances的倍数,以确保每个Buffer Pool实例中包含的chunk数量相同。

  • 若在服务器启动时,innodb_buffer_pool_chunk_size × innodb_buffer_pool_instances大于innodb_buffer_pool_size,则innodb_buffer_pool_chunk_size会被自动设置为innodb_buffer_pool_size / innodb_buffer_pool_instances的值。

示例与解释

示例1:innodb_buffer_pool_size = 8G

-- 启动MySQL服务器时的设置
mysqld --innodb-buffer-pool-size=8G --innodb-buffer-pool-instances=16

-- 查询当前配置
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
-- 输出:innodb_buffer_pool_size: 8589934592(8G)

-- 若设定的大小不是2G的整数倍,系统会将其调整为最接近的2G的整数倍

示例2:innodb_buffer_pool_size = 9G

-- 启动MySQL服务器时的设置
mysqld --innodb-buffer-pool-size=9G --innodb-buffer-pool-instances=16

-- 查询当前配置
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
-- 输出:innodb_buffer_pool_size: 10737418240(10G)

-- 若设定的大小不是2G的整数倍,系统会将其调整为最接近的2G的整数倍

示例3:innodb_buffer_pool_size = 2G,innodb_buffer_pool_chunk_size = 256M

-- 启动MySQL服务器时的设置
mysqld --innodb-buffer-pool-size=2G --innodb-buffer-pool-instances=16 --innodb-buffer-pool-chunk-size=256M

-- 查询当前配置
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
-- 输出:innodb_buffer_pool_size: 2147483648(2G)

SHOW VARIABLES LIKE 'innodb_buffer_pool_chunk_size';
-- 输出:innodb_buffer_pool_chunk_size: 134217728(128M)

-- 若chunk大小乘以实例数超过了设定的Buffer Pool大小,系统会自动调整chunk大小
-- 2*1024/16=128M

当你发现这些内容对你有帮助时,为了支持我的工作,不妨给一个免费的⭐Star,这将是对我最大的鼓励!感谢你的陪伴与支持!一起在技术的路上共同成长吧!点击链接:GitHub | Gitee

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[spring] rest api security

[spring] rest api security 之前的 rest api CRUD 都没有实现验证(authentication)和授权(Authorization),这里使用 Spring security 进行补全 spring security 是一个非常灵活、可延伸的实现方式,比较简…

初识LangChain的快速入门指南

LangChain 概述 LangChain是一个基于大语言模型用于构建端到端语言模型应用的框架,它提供了一系列工具、套件和接口,让开发者使用语言模型来实现各种复杂的任务,如文本到图像的生成、文档问答、聊天机器人等。 LangChain简化了LLM应用程序生…

PostCSS概述和应用

文章目录 PostCSS概述**核心特性与工作原理:****应用场景与优势:****社区与生态:** PostCSS应用实例 PostCSS概述 PostCSS 是一款开源的、用 JavaScript 编写的 CSS 处理工具,其核心设计理念是利用 JavaScript 的强大编程能力和丰…

51-40 Align your Latents,基于LDM的高分辨率视频生成

由于数据工程、仿真测试工程,咱们不得不进入AIGC图片视频生成领域。兜兜转转,这一篇与智驾场景特别密切。23年4月,英伟达Nvidia联合几所大学发布了带文本条件融合、时空注意力的Video Latent Diffusion Models。提出一种基于LDM的高分辨率视…

synchronized的优化策略^o^

synchronized 特点: 开始是乐观锁,如果锁冲突,就转换为悲观锁开始是轻量级锁,如果锁被持有的时间较长,就转换为重量级锁实现轻量级锁的时候大概率用到的是自旋锁策略是一种不公平锁是一种可重入锁不是读写锁 synchro…

【考研数学】《1800》《660》《880》如何选择及搭配?看这一篇!

可以刷880!但一定要把心态稳住!!! 我考研的时候刷880前几章还可以,越往后越刷不动 因为很多人在备考前两轮的后期听课和刷题都不如前几章细心...越往后知识点掌握的越来越不熟练,所以也建议大家在前几轮复…

Kafka复习

消息中间件的作用: 异步处理: 与并行相比,虽然减少了时间,但是还是得等待其他线程执行完,但是消息中间件对于简单的业务处理,还要引入一个中间件也比较复杂如果我投递了简历之后需要发送成功邮件以及短信,就可以交给消息中间件就像数据库、redis数据一致性,需要用到延迟…

VScode使用记录

代码颜色是白色 发现没有根据对应的文本类型显示颜色 解决方法: 效果:

「sentinel」流量控制组件的应用

「sentinel」流量控制组件的应用 Sentinel版本QPS 一、初识Sentinel1、Sentinel2、Sentinel 和 Hystrix对比3、雪崩问题 二、环境搭建1、下载安装Sentinel2、微服务整合Sentinel 三、流量控制1、簇点链路2、流控设置3、流控模式直接关联链路 4、流控效果流控效果解释 四、热点限…

线性表的链式存储(循环链表)

文章目录 前言一、循环链表是什么?二、循环链表的操作实现总结 前言 T_T此专栏用于记录数据结构及算法的(痛苦)学习历程,便于日后复习(这种事情不要啊)。所用教材为《数据结构 C语言版 第2版》严蔚敏。有关…

Codeforces Round 939 (Div. 2) A~E

A.Nene’s Game(循环) 题意: 妮妮发明了一种基于递增序列 a 1 , a 2 , … , a k a_1,a_2,\ldots,a_k a1​,a2​,…,ak​的新游戏。 在这个游戏中,最初 n n n个玩家排成一排。在这个游戏的每一轮中,都会发生以下情况…

详解SPI通信协议以及FPGA实现

文章目录 一、SPI简介二、SPI通信结构三、多从机模式四、时钟极性(CPOL)和时钟相位(CPHA)五、SPI通信过程六、实现SPI主机发送程序6.1 波形图分析6.2 Verilog代码6.3 发送数据控制模块6.4 仿真代码编写以及仿真结果分析 七、Veril…

Kubernetes Pod的配置管理 ConfigMap和Secret

目录 前言 一、为什么需要配置管理 二、使用ConfigMap管理Pod的配置信息 2.1 创建ConfigMap(4种方式) 2.1.1 指定ConfigMap的参数创建 2.1.2 指定配置文件创建ConfigMap 2.1.3 通过一个文件内的多个键值对创建ConfigMap 2.1.4 yaml文件创建Config…

Android 性能优化(七):APK安装包体积优化

包体积优化重要性 移动 App 特别关注投放转化率指标,而 App 包体积是影响用户新增的重要因素,而 App 的包体积又是影响投放转化率的重要因素。 Google 2016 年公布的研究报告显示,包体积每上升 6MB 就会带来下载转化率降低 1%, …

114 接口中幂等性的保证

前言 同样是 面试问题 如何确保接口的 幂等性 幂等是一个 较为抽象的概念, 多次重复访问, 不会导致业务逻辑的异常 这里从增删改查, 几个方面列一下 一般来说, 我们核心需要关注的就是 新增 和 更新 对于 增加元素, 首先针对唯一约束进行校验, 然后再处理新增的相关业…

二刷大数据(三)- Flink1.17

目录 Flink概念与SparkStreaming区别分层API 工作流程部署模式**Local Mode****Standalone Mode****YARN Mode****Kubernetes Mode****Application Mode** 运行架构stand alone 核心概念算子链任务槽 窗口窗口**窗口的目的与作用****时间窗口(Time Windows&#xff…

vue3中web前端JS动画案例(一)

上述案例主要使用定时器&#xff0c;和绝对定位产生动画 <script setup> import { ref, onMounted, watch } from vue // ----------------------- 01 js 动画介绍--------------------- // 1、匀速运动 // 2、缓动运动&#xff08;常见&#xff09; // 3、透明度运动 //…

抖店底层逻辑,关于5个“为什么”的答案~

我是王路飞。 很多人对抖店的底层逻辑有一种抗拒心态&#xff0c;不想学习和了解。 认为做抖店不就是开店卖货嘛&#xff0c;什么火、什么有热度卖什么就好了&#xff0c;了解那么多“理论知识”有什么用呢&#xff1f; 但往往正是这些基础理论&#xff0c;底层逻辑&#xf…

Linux系统一键安装DataEase结合内网穿透实现公网访问本地WebUI界面

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

PMM2 MySQL监控管理工具

目录 1. PMM介绍 2. 安装PMM服务端 2.1 安装docker 2.1.1 下载docker 2.1.2 上传docker包 2.1.3 启动守护进程 2.1.4 查看docker状态 2.2 安装PMM 2.2.1 下载镜像 2.2.2 load镜像 2.2.3 查看镜像 2.2.4 创建容器 2.2.5 运行镜像 2.2.6 验证PMM服务器 2.2.7 删除…