调节磁盘和CPU的矛盾——InnoDB的Buffer Pool

缓存的重要性

  • 无论是用于存储用户数据的索引【聚簇索引、二级索引】还是各种系统数据,都是以页的形式存放在表空间中【对一个/几个实际文件的抽象,存储在磁盘上】
  • 如果需要访问某页的数据,就会把完整的页数据加载到内存中【即使只访问页中的一条记录】,在读写访问之后不立即释放该页的内存空间,将其缓存起来,下次请求访问该页面就可以省下磁盘I/O开销

Buffer Pool

  • 在MySQL服务器启动时就向操作系统申请一片连续的内存,innodb_buffer_pool_size【不包含控制块所占的内存空间大小】
    BufferPool内部组成

  • 连续的内存被划分为若干个页面【缓冲页】,页面大小与InnoDB表空间使用的页面大小一致【默认16KB】

  • 控制信息【所属的表空间编号、页号、缓冲页在Buffer Pool中的地址、链表节点信息等】-方便管理

  • 控制信息占用的一块内存称为控制块,与缓冲页一一对应

  • 在这里插入图片描述

  • 碎片-剩余空间不够一对控制块和缓冲页的大小

    • 在debug模式下控制块占缓冲页大小的5%左右,在非debug模式下控制块模块会更小点

free链表管理

在这里插入图片描述

  • Buffer Pool初始化过程

    • 向操作系统申请Buffer Pool的内存空间
    • 划分为若干对控制块和缓冲页【没有真实的磁盘页被缓存到Buffer Pool中(还没用到)】
    • 随着程序运行,磁盘的页不断被缓存到Buffer Pool中
      • 当磁盘读取一个页到缓冲池中,该放到哪个缓冲页【哪个缓冲页是空闲的】
      • 需要查看缓冲页对应的控制块
        • 将所有空闲的缓冲页控制块作为一个节点放在一个链表中【free链表、空闲链表】
          • 为了管理好free链表,定义一个基节点【包含链表的头节点地址、尾节点地址、当前链表中节点的数量等信息】
          • 基节点占用的内存空间不包含在Buffer Pool申请的内存空间内,而是单独申请的一块内存空间【一般40字节】
      • 每当磁盘加载一个页到Buffer Pool中,就从空闲链表中取一个控制块对应的缓冲页(从链表取控制块,通过控制块访问真正的页),然后把该缓冲页对应的free链表节点【对应的控制块】从链表中移除,表示该缓冲页被使用
  • 缓冲页的哈希处理

    • 表空间号+页号【key】来定位一个页,缓冲页控制块【value】
    • 需要访问某个页的数据时,先从哈希表中根据表空间号+页号看是否有对应缓冲页
      • 有-直接使用
      • 没有-从free链表中选一个空闲的缓冲页,把磁盘中对应的页加载到该缓冲页的位置
  • flush链表的管理
    在这里插入图片描述

    • 存储脏页的链表【Buffer Pool中修改过的,还未刷新到磁盘上的页】
    • 某个缓冲页对应的控制块不可能既是free链表的节点,也是 flush链表的节点【不可能既是脏页也是空闲页】
  • LRU链表的管理

    • Buffer Pool命中率越高越好【命中次数/访问了n页】
    • 简单的LRU链表
      • 使用到某个缓冲页,就把该页从磁盘加载到Buffer Pool中时,把该页对应的控制块作为节点塞到LRU链表的头部
      • 当空闲缓冲页使用完时,到LRU链表的尾部淘汰缓冲页
    • 划分区域的LRU链表
      • 简单LRU链表存在情况
        • InnoDB提供了预读服务,认为执行当前请求时,可能会在后面读取到某些页面就预先把这些页面加载到Buffer Pool中,如果预读成功可以极大提高执行效率,但如果用不到的话,前面所说的链表就会存在问题,Buffer Pool的命中率会大大降低【加载到Buffer Pool中的页不一定被用到】
          • 线性预读
            • 如果顺序访问的某个区(extent)的页面超过了系统变量innodb_read_ahead_threshold【一般默认56,服务器启动时通过启动选项来调整,或者使用SET GLOBAL命令来修改该全局变量】,会触发一次异步读取下一个区中全部的页面到Buffer Pool中
          • 随机预读
            • 如果某个区的13个连续页面被加载到Buffer Pool中【也就是指在后面提到的整个young区域的头1/4】,无论是否是顺序读取,都会触发一次异步读取本区中所有其他页面到Buffer Pool中的请求
            • 全局变量innoddb_random_read_ahead系统变量,默认值为OFF,不会默认开启随机预读功能
        • 全表扫描,全部叶子节点读一遍,后续执行其他语句时,又要把前面被淘汰的页面加载进Buffer Pool中【如果有很多使用频率低的页被同时加载到Buffer Pool中,可能会把使用频率高的页从Buffer Pool中淘汰掉
      • 将LRU链表分为两节
        • 一部分存储使用频率高的缓冲页【这部分链表叫热数据young区域】

        • 另一部分存储使用频率低的缓冲页【冷数据old区域】

        • 在这里插入图片描述

        • 随着程序的运行,某个节点所属的区域也可能发生变化

        • old区域大小可通过innodb_old_blocks_pct修改【一般3/8】

        • 在对某个处于old区域的缓冲页进行第一次访问时,就在它对应的控制块中记录下这个访问时间,如果后续的访问时间与第一次访问的时间在innodb_old_blocks_times时间间隔内,那么该页面就不会从old区域移到young区域的头部【可能是一次全表扫描的多次访问】

      • 进一步优化 LRU链表
        • 只有被访问页位于young区域1/4的后面时,才回被移动到LRU链表头部,可以降低调整LRU链表的频率,提升性能【减少链表的节点移动】
        • 优化核心:尽量高效地提高Buffer Pool命中率

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

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

相关文章

springboot和springcloud的区别

1. ‌目的与功能‌ ‌1)Spring Boot‌: 主要用于快速构建独立的、生产级的 Spring 应用程序。它通过自动配置和嵌入式服务器等特性,简化了微服务的开发、启动和部署,使开发者能够专注于业务逻辑而非繁琐的配置。‌Spring Boot是一个快速开发的框架,旨在简化Java应用程序的开…

耘想WinNAS:以聊天交互重构NAS生态,开启AI时代的存储革命

一、传统NAS的交互困境与范式瓶颈 在传统NAS(网络附加存储)领域,用户需通过复杂的图形界面或命令行工具完成文件管理、权限配置、数据检索等操作,学习成本高且效率低下。例如,用户若需搜索特定文件,需手动…

在断网的时候,websocket 一直在CLOSING 状态

现象 websocket 先连接成功,然后断网。 由于维护了一套心跳机制,前端发起心跳,如果一段时间内没有收到服务端返回的心跳。则表示连接断开。 用心跳的方式处理断网的兜底情况。 然而,此时网络是断开的,在代码中直接调…

基于AWS的大模型调用场景:10大成本优化实战方案

大模型训练与推理是AI领域的计算密集型场景,如何在AWS上实现高性能与低成本的双重目标?本文从实例选型、弹性伸缩、存储优化等角度,分享10个经过验证的AWS成本优化策略,帮助企业节省30%以上成本。 一、大模型场景的成本痛点分析 计…

【网络原理】TCP/IP协议五层模型

目录 一. 协议的分层 二. OSI七层网络协议 三. TCP/IP五层网络协议 四. 网络设备所在分层 五. 封装 六. 分用 七. 传输中的封装和分用 八. 数据单位术语 一. 协议的分层 常见的分层为两种OSI七层模型和TCP/IP五层模型 为什么要协议分层? 在网络通信中&…

科技快讯 | 阿里云百炼MCP服务上线;英伟达官宣:CUDA 工具链将全面原生支持 Python

李飞飞团队最新AI报告:中美模型性能差距近乎持平 4月8日,斯坦福大学以人为本人工智能研究所发布《2025年人工智能指数报告》。报告显示,2023年AI性能显著提升,AI应用加速,投资增长,中美AI模型差距缩小。报告…

猫咪如厕检测与分类识别系统系列【三】融合yolov11目标检测

✅ 前情提要 家里养了三只猫咪,其中一只布偶猫经常出入厕所。但因为平时忙于学业,没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关,频繁如厕可能是泌尿问题,停留过久也可能是便秘或不适。为了更科学地了解牠…

2025年燃气证书:传承与发展的行业纽带

回溯历史长河,能源的利用与人类文明的发展息息相关。从远古时期的钻木取火,到如今广泛应用的燃气能源,每一次能源的变革都推动着社会的巨大进步。而在现代燃气行业蓬勃发展的背后,燃气从业人员资格证书正扮演着传承与发展的重要纽…

在Ubuntu下进行单片机开发是否需要关闭Secure Boot

1. Secure Boot的作用 功能:Secure Boot是UEFI的安全功能,旨在阻止未经验证的驱动或操作系统启动,防止恶意软件篡改引导过程。 影响范围:它主要限制的是操作系统启动阶段加载的内核级驱动(如显卡驱动、虚拟化模块&…

国达陶瓷重磅推出陶瓷罗马柱外墙整装尖端新产品“冠岩臻石”

近日,记者在佛山国达建材有限公司(以下简称国达陶瓷)董事长杨建平处了解到,该公司重磅推出的“冠岩臻石”新产品,是属于陶瓷罗马柱外墙整装产品中的尖端产品。新产品自面市之后,深受高端用户的青睐与认可。…

【分享】Ftrans文件摆渡系统:既保障传输安全,又提供强集成支持

【分享】Ftrans文件摆渡系统:既保障传输安全,又提供强集成支持! 在数字化浪潮中,企业对数据安全愈发重视,网络隔离成为保护核心数据的关键防线,比如隔离成研发网-办公网、生产网-测试网、内网-外网等。网络…

实验一 字符串匹配实验

一、实验目的 1.熟悉汇编语言编程环境和DEBUG调试程序的使用。 2.掌握键盘输入字符串的方法和分支程序的设计。 二、实验内容 编程实现:从键盘分别输入两个字符串,然后进行比较,若两个字符串的长度…

添加登录和注册功能

先写前端再写后端 前提&#xff1a;ideavue3mybatisspringBoot3前后端分离实现对一张表的增删改查&#xff08;完整代码版&#xff09;-CSDN博客 项目地址 1.添加一个Login.vue视图 <template><div class"login_container"><div class"login…

【Windows】系统安全移除移动存储设备指南:告别「设备被占用」弹窗

Windows系统安全移除移动存储设备指南&#xff1a;告别「设备被占用」弹窗 解决移动硬盘和U盘正在被占用无法弹出 一、问题背景 使用Windows系统时&#xff0c;经常遇到移动硬盘/U盘弹出失败提示「设备正在使用中」&#xff0c;即使已关闭所有可见程序。本文将系统梳理已验证…

Springboot下载文件, 文件名中文是乱码, 空格变加号

默认把文件名放上去, 中文会乱码, 文件名种有空格, 就会被截断 public void download(HttpServletResponse response){// 文件名先进行url编码, 避免乱码问题// 把用%20进行替换fileName URLEncoder.encode(fileName, "UTF-8").replace("", "%20&qu…

MySQL 超详细安装教程与常见问题解决方案

一、MySQL 安装教程 1. Windows 系统安装&#xff08;以 MySQL 8.0 为例&#xff09; 步骤 1&#xff1a;下载 MySQL Installer 访问 MySQL 官网下载页面。 选择 Windows (x86, 64-bit), MSI Installer&#xff08;推荐使用完整版 mysql-installer-web-community-8.0.xx.xx.…

【cuda学习日记】5.2.1 共享内存额外篇

共享内存(Shared Memory) 1.是一种低延迟、高带宽的片上内存 2.由同一个Block内的所有线程共享 3.生命周期与Block相同 4.访问速度比全局内存快约100倍 Block(线程块) 1.GPU执行的基本单位&#xff0c;包含一组线程 2.多个Block组成Grid(网格) 3.Block内的线程可以通过共享内存…

[250411] Meta 发布 Llama 4 系列 AI 模型 | Rust 1.86 引入重大语言特性

目录 Llama 4 家族登场&#xff1a;开启原生多模态 AI 创新新纪元Rust 1.86.0 版本发布亮点主要新特性与改进其他重要信息 Llama 4 家族登场&#xff1a;开启原生多模态 AI 创新新纪元 Meta AI 近日发布了其最新、最先进的 Llama 4 系列人工智能模型&#xff0c;标志着 AI 技术…

ArrayList 和 数组 的区别

定义与本质 数组&#xff1a;是 Java 语言内置的数据结构&#xff0c;是存储相同类型元素的连续内存空间。它是一个基本的语言特性&#xff0c;在内存中是一块连续的区域。ArrayList&#xff1a;是 Java 集合框架中的一个类&#xff0c;属于动态数组。它是基于数组实现的&#…

​‌FireCrawl‌爬虫工具​, Craw4ai

‌FireCrawl‌是一款开源的AI爬虫工具&#xff0c;专门用于Web数据提取&#xff0c;并将其转换为Markdown格式或其他结构化数据。FireCrawl特别适合处理使用JavaScript动态生成的网站&#xff0c;能够自动抓取网站及其所有可访问的子页面内容&#xff0c;并将其转换为适合大语言…