从零开始:深入了解 MySQL 的 Buffer Pool

从零开始优化MySQL8.X内存占用:我的踩坑与最佳实践分享 本文分享了MySQL 8.X内存占用的深度优化实践。作者从一次线上故障出发,详细剖析了MySQL 8.X的内存架构,提供了从操作系统诊断到内部状态查询的完整排查流程。文章重点讲解了核心参数(如innodb_buffer_pool_size、会话缓冲区)的调优策略与风险,并强调了SQL优化与架构设计(如索引、读写分离)才是根本解决之道,帮助读者系统性解决数据库内存瓶颈。 阅读详情

1:一切从数据库的增删改查开始

  • Buffer Pool 在数据库中是一个非常重要的组件,我们知道我们的数据最终都是保存在磁盘中的,但是我们每次查询或者修改都不可能从磁盘中去拿数据吧。这样的话我们查询或者修改的性能就会非常低。
  • 所以MySql有个Buffer Pool来解决这个问题,Buffer Pool就是MySql数据库中的一块内存,我们实际的操作数据库数据其实都是会在这块内存中操作

2:Buffer Pool长什么样子

  • Buffer Pool是MySql中的一块内存,默认是128MB,当然我们也可以自己设置,使用 innodb_buffer_pool_size=2147483648

    7678efc34e37b4572b6efc15ba787fd.png

  • 数据页:既然我们知道数据是存放在Buffer Pool中的,那么我们的数据又是如何放在Buffer Pool中的呢??是一行一行的放还是其它方式存放的??

    -- 实际上MySql抽象出了一个数据页的概念。MySql把很多条数据都放在同一个数据页中。如下图所示

-- 所以当我们要更新一条数据,首先会找到这行数据所在的数据页,然后从磁盘文件里把这行数据所在的数据页直接加载到Buffer Pool中,如下图


  • 缓存页对应的描述细信息:对于每一个缓存页,它实际都有一个描述信息,这个描述信息大体可以认为是用来描述这个缓存页的,比如包含如下这些信息:这个数据页所属的表空间,数据页编号,这个缓存页在Buffer Pool中的地址以及一些别的信息,所以此时我们看下面的图,Buffer Pool实际看起来长这个样子

-- 这里我们要注意一点,Buffer Pool的描述数据大概相当于缓存页的5%左右,假设你设置的Buffer Pool的大小是128Mb,实际上可能会大一些,因为他里面还要存放信息描述数据

3:如果数据库突然挂了,那么内存中的数据怎么办??

  • 因为我们在更新数据的时候都是在Buffer Pool中操作,这时候更新之后的数据还在Buffer Pool中,还没有刷到磁盘中去,如果这时候MySql挂了,那么内存中的数据就会没有了,那怎么办呢?? 这就需要MySql的几种日志文件来保证我们的数据不会丢失了

4:从磁盘读取数据页到Buffer Pool的时候,free链表有什么用??

  • 现在我们知道当我们要更新一条数据的时候,首先会去磁盘拿到这条数据所在的数据页,然后将整个数据页加载到Buffer Pool中,我们知道数据页与缓存页是一一对应的,也就是从磁盘读取一个数据页之后,会从Buffer Pool中找到一个空闲的缓存页,然后将数据页放进去,那么现在问题来了,MySql是怎么知道哪些缓存页是空闲的呢??

  • free链表:是一个双向链表,在我们第一次启动MySql的时候,整个Buffer Pool都是空的,所有的缓存页也都是空闲的,这时候,MySql会将所有的空闲的缓存页的描述数据块都放到free这个链表中去,当我们从磁盘中加载数据页的时候,会从旁free链表中拿到一块空闲的缓存页的描述数据块,然后将这个数据页放到缓存页中,最后将这个缓存页从free链表中删除

5:当我们更新Buffer Pool中的数据的时候,flush链表有什么用??

  • 当我们执行增删改操作的时候,如果发现Buffer Pool中没有数据就会从磁盘中加载对应的数据页,然后从free链表中拿到一块空闲的缓存页将数据页放到缓存页中。之后对该数据页中的数据进行操作的时候就直接在Buffer Pool中进行了,这时候你更新了一条数据,那么缓存中的数据与磁盘中的数据就不一致了,这时候就产生了脏页了
  • 当产生了脏页之后,MySql需要将这些脏页刷新到磁盘中去。但是我们也不能将所有的缓存页都刷到磁盘中去吧,其实我们只需要把那些被修改过的也就是脏页刷到磁盘就行了,这时候flush链表的作用就体现出来了,只要是被修改过的缓存页,都会被放到一个flush链表中,下次只需要将flush链表中的缓存页刷到磁盘就行了,flush链表整体跟free链表是差不多的

6:如果Buffer Pool满了该怎么办??Lru链表是做什么的??

  • 我们知道Buffer Pool是有大小限制的,不可能让你无限存数据,如果Buffer Pool满了之后该怎么办??MySql会把缓存页里被修改过的缓存页刷到磁盘中去,然后这个缓存页就可以清空了,如果被经常访问的缓存页就会被放到Lru链表的头部,所以每次刷盘都是会从Lru链表尾部去刷盘

7:基于冷热数据分离思想设计Lru链表

  • Lru链表会被分为二部分,一部分是热数据,一部分是冷数据,这个冷数据的比例是由innodb_old_blocks_pct参数控制的,它默认是37,也就是冷数据占37%

  • 数据页第一次被加载到缓存中去的时候,是会被放到冷数据区域的头部,然后在1s之后你继续访问了这个缓存页,那么这个缓存页就会从冷数据区域移到热数据区域的头部

8:Lru链表是如何进行优化的

  • 如果在Lru热数据区域头部的几个缓存页经常被访问,那么访问一次就要移动一次,这样会产生一定的消耗,所以MySql设置了如果是热数据区域的后3/4的缓存页被访问了才会将缓存页移动到头部去

9:题外话:MySql预读机制

  • MySql在磁盘读取一个数据页的时候,可能会将相邻的数据页都加载到Buffer Pool中去

  • MySql什么时候会触发预读机制??

    • 有一个参数是innodb_read_ahead_threshold,它的默认值是56,也就是如果顺序访问了一个区里的多个数据页,访问的数据页超过这个阈值,此时就会触发预读机制
    • 如果Buffer Pool里缓存了一个区里13个连续的数据页,而且这些数据都是比较频繁被访问到的,此时就会直接触发预读机制
从零开始:MySQL8.X内存优化全攻略(含常见错误排查) 本文详细解析了MySQL 8.X版本的内存管理架构,涵盖全局内存与会话内存的核心组件。提供了从新项目科学规划到现有系统精准调优的完整实战指南,包括关键参数配置、性能诊断工具使用以及常见内存错误(如连接中断、内存泄漏)的排查与解决方案,帮助用户构建稳定高效的数据库环境。 阅读详情

相关推荐

MySQL 8.0在Ubuntu上的安装与优化:从零开始配置不区分大小写数据库

本文详细指导如何在Ubuntu系统上从零安装并优化MySQL 8.0数据库,重点解决开发中常见的表名大小写敏感问题。通过配置`lower_case_table_names`参数,实现数据库不区分大小写,并深入讲解安装路径选择、核心性能调优、安全加固及日常运维实践,帮助开发者构建高效稳定的生产级数据库环境。

weixin_29215391的博客 692

Mysql中的Buffer pool

1、回顾一下Buffer Pool是个什么东西?数据库中的Buffer Pool是个什么东西?其实他是一个非常关键的组件,数据库中的数据实际上最终都是要存放在磁盘文件上的,如下图所示。但是我们在对数据库执行增删改操作的时候,不可能直接更新磁盘上的数据的,因为如果你对磁盘进行随机读写操作,那速度是相当的慢,随便一个大磁盘文件的随机读写操作,可能都要几百毫秒。如果要是那么搞的话,可能你的数据库每秒也就只能处理几百个请求了!

chuixue24的博客 1228

Debian 10 多版本 PHP 共存实战:基于 PHP-FPM Pool 的隔离部署

PHP 多版本共存是现代 Web 运维的基础能力,其核心原理在于将 PHP 解释器进程化、服务化,通过进程隔离实现版本并行运行。技术价值体现在业务兼容性保障与系统稳定性提升——避免因框架/插件版本锁定导致的升级僵局。典型应用场景包括混合架构的遗留系统迁移、多客户 SaaS 环境隔离、以及 WordPress 与 Laravel 并存的中小企业服务器。关键实现依赖 PHP-FPM 的 Pool 机制与 Apache 的 ProxyPass 路由能力,而非全局切换或模块混用。本文聚焦 Debian 10(Bus

weixin_34117211的博客 420

MySQL Buffer Pool 解析:原理、组成及作用

当我们谈论MySQL的性能优化时,InnoDB存储引擎的缓冲池(Buffer Pool)是一个无法忽视的关键组件。作为内存中的一个重要区域,缓冲池对于减少磁盘I/O操作、加速数据访问起着至关重要的作用。本文将详细阐述MySQL缓冲池的原理、组成、各部分的作用、历史演进,以及它在数据增删改查过程中的流程和作用。

码到三十五 2万+

RseQC实战指南:从安装到RNA-Seq数据质控全流程解析

本文提供了一份详尽的RseQC实战指南,涵盖从安装配置到RNA-Seq数据质控的全流程。文章重点解析了RseQC作为专业质控工具的核心价值,手把手指导如何通过Conda或pip完成安装,并深入讲解了bam_stat.py、geneBody_coverage.py等关键模块的使用方法与结果解读技巧,帮助用户有效评估RNA完整性、文库构建质量及链特异性,确保下游分析的可靠性。

weixin_29200741的博客 204

WS2812B非标准通信协议:手把手实现精准时序控制

详解WS2812B的精准时序实现原理,剖析其非标准通信协议的关键细节。通过实际操作指导,帮助开发者稳定驱动ws2812b灯带,解决常见时序偏差问题,提升项目显示效果与响应一致性。

weixin_42584586的博客 587

从零开始深入了解MySQL的Buffer Pool

- 这里我们要注意一点,Buffer Pool的描述数据大概相当于缓存页的5%左右,假设你设置的Buffer Pool的大小是128Mb,实际上可能会大一些,因为他里面还要存放信息描述数据。-- 所以当我们要更新一条数据,首先会找到这行数据所在的数据页,然后从磁盘文件里把这行数据所在的数据页直接加载到Buffer Pool中,如下图。

lt_xiaodou的博客 843

cocos2dx lua + protobuf

vs 2015 cocos2dx 3.10  lua  protobuf1. 下载 protobuf 源码     https://github.com/bnnswyp/protobuf/tree/master/protobuf-2.5.0    解压后的文件列表如下所示         其中 vsprojects 文件夹为 protobuf 的vs 工程2. 打开 protobuf.sln 编译...

u014486706的博客 2164

Mysql——》查看BufferPool相关信息

查看InnoDB存储引擎运行过程中的状态信息(包括BufferPool相关信息)

小仙~ 911

Keil MDK编译错误#541解决方案与ARM_Compiler包解析

在嵌入式开发中,编译器工具链的依赖管理是确保项目顺利构建的关键环节。以Keil MDK为例,其软件包依赖机制通过组件化设计实现功能解耦,其中ARM_Compiler包专门处理系统IO重定向等编译器扩展功能。这种架构既提升了模块复用性,也带来了版本兼容性挑战。当出现'Error #541: component missing'报错时,通常是由于中间件组件(如文件系统)在新版本中显式依赖了ARM_Compiler包。开发者需要通过Pack Installer安装该包,并在Run-Time Environment

weixin_32129187的博客 370

Winform中使用EasyPlayer-RTSP-Win开源组件实现播放RTSP视频流

场景 开源RTMP组件EasyPusher-Android+EasyDarwin实现APP推流给RTSP流媒体服务器: 开源RTMP组件EasyPusher-Android+EasyDarwin实现APP推流给RTSP流媒体服务器_BADAO_LIUMANG_QIZHI的博客-优快云博客 上面介绍了RTSP相关的开源组件,如果要在Windows中实现对RTSP视频流的播放, 可以使用开源组件EasyPlayer-RTSP-Win GitHub - tsingsee/EasyPlayer-RTSP

BADAO_LIUMANG_QIZHI的博客 1万+

Mysql中的BufferPool

MYSQL 中的bufferpool详解

qq_59395271的博客 871

Android System UI 深度解析:从架构演进到车载 / TV 场景的全维度定制

本文全面解析 Android System UI 的架构设计、功能演进及场景化定制,揭示其作为安卓系统核心交互层的技术特性与生态价值。

学无止境 1585

从零开始带你成为MySQL实战优化高手学习笔记(三)MySQL Buffer Pool的运行过程

在之前的文章《从零开始带你成为MySQL实战优化高手学习笔记(二) 关于buffer pool的相关知识》中,已经简单的了解了的一些buffer pool的东西:free链表用来记录哪些缓存页是空的,flush链表记录哪些是被修改过的。 目录 1、缓存页满了怎么办? 1.1、LRU淘汰算法 1.1.1、策略: 1.1.2、存在的问题: 1.2、基于冷热数据分离的思想设计LRU链表 1.2.1、策略 1.2.2、性能优化 1.3、冷数据的刷盘机制 1.4、总结 1.5 问题 1、缓存页

刘墨泽 967

第9章:Embedding、Pooling 与检索增强基础

本文介绍了律师事务所如何利用vLLM构建法律文档RAG系统,解决传统关键词检索在语义匹配上的不足。主要内容包括: 项目背景:传统Elasticsearch检索在法律术语上的低准确率问题,及多模型维护的复杂性; 技术方案:采用vLLM统一支持生成和向量化能力,通过语义向量检索提升相关性; 关键实现: 用vLLM的Embedding端点处理文档向量化 构建包含离线索引和在线检索的完整RAG流程 采用余弦相似度进行语义匹配 实践建议:切片大小选择、向量归一化处理、不同场景下的数据库选型等。

davidwang456的专栏 60

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

(四)大白话MySQL的Buffer Pool内存结构

MySQL的Buffer Pool内存结构和free链表、flush链表、LRU链表

zht245648124的博客 1462

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

从零开始带你成为MySQL实战优化高手学习笔记(二) Innodb中Buffer Pool的相关知识

在从零开始带你成为MySQL实战优化高手学习笔记(一)中学习到一条语句到底是怎么执行的,从链接获取数据到通过查询解析器解析SQL语句表达的什么意思,解析之后由查询优化器生成查询路径树,选出一条最优查询路径调用存储引擎接口 ...

刘墨泽 1268

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

MyISAM的key_buffer_size和InnoDB的innodb_buffer_pool_size

一.MyISAM的key_buffer_size MyISAM的索引方式是非聚集索引,主索引和其他索引没有本质区别,在data域都是存储了具体记录行的地址.key_buffer_size规定了系统将多少内存用作MyISAM的索引缓存.如果内存足够大,又不想去计算,一个简单的计算办法就是将所有的索引文件加起来作为key_buffer_size的大小(当然这会存在大量的浪费),但确实一种简便的办法....

weixin_33738982的博客 748

Java开发必知必会的MySQL核心知识点(一)-基础入门:从零开始认识数据库核心

《Java开发者必备:MySQL核心知识体系精讲》摘要 本文针对Java开发者系统梳理MySQL知识体系,揭示大多数开发者仅停留在"会用"层面的现状。文章分为5篇系列教程,涵盖: 基础架构(Server层/引擎层、SQL执行流程) 索引原理与优化(B+Tree、覆盖索引) 事务与锁机制(ACID、MVCC) 高级架构(主从复制、分库分表) 实战面试精讲;

专注Java后端开发,分享SpringBoot微服务、高并发优化、生产环境踩坑实录,帮你少走弯路,让我们一起从CRUD进阶到架构师。 310

从零开始:MySQL5.6的Windows安装与性能调优初探

本文详细介绍了MySQL5.6在Windows环境下的专业安装与性能调优指南,包括环境准备、安装步骤、配置文件优化、服务启动及性能调优实战技巧。特别适合中小型应用系统在Windows服务器环境中部署,帮助用户快速掌握MySQL5.6的安装与优化方法。

weixin_29206669的博客 437

从零开始:MySQL8.X内存优化全攻略(含常见配置误区解析)

本文系统解析了MySQL 8.X内存优化的核心策略与常见误区。针对线上环境内存使用率居高不下的问题,深入剖析了内存架构组成,重点指导如何精准排查内存消耗源头,并提供了InnoDB缓冲池、会话级内存等关键参数的配置避坑指南与实战诊断方法,帮助读者实现从盲目调参到精准优化的转变。

e6f7g8h9i的博客 421

MySQL 8.0.31 生产环境部署全攻略:从安装到安全加固

数据库作为现代应用的核心数据存储层,其部署的规范性与稳定性直接影响系统性能与安全。以MySQL为例,其安装与初始化过程涉及系统环境检查、依赖管理、目录规划、权限控制及参数调优等多个关键环节。理解这些底层原理,不仅能确保数据库服务稳定运行,更能为后续的性能优化、高可用架构(如主从复制)奠定坚实基础。在MySQL 8.0版本中,诸如默认身份认证插件变更、InnoDB缓冲池优化、JSON功能增强等特性,进一步提升了其在处理事务性负载和复杂查询时的技术价值。本文聚焦于MySQL 8.0.31这一长期支持版本的部署实

weixin_33965305的博客 333

Ubuntu 18.04下MySQL远程部署实战:解耦Web与DB提升性能

远程数据库是一种将应用服务与数据存储物理或逻辑分离的基础架构模式,其核心原理在于消除CPU缓存、内存带宽和磁盘IO的资源争抢,从而降低请求延迟并提升系统可预测性。该方案的技术价值不在于分布式复杂度,而在于以极小改动实现资源边界清晰化与故障归因简化,特别适用于中小规模LAMP/LEMP架构的性能瓶颈突破。典型应用场景包括WordPress、Laravel等PHP框架的高并发优化,以及运维新手对连接池、网络延迟、SSL握手等关键链路指标的实测观察。本文基于Ubuntu 18.04 + MySQL 5.7组合,聚

人生的意義在於修煉!修煉之路~ 412

Ubuntu 20.04 MySQL 安装配置避坑指南:从默认陷阱到生产就绪

MySQL 是最主流的开源关系型数据库,其安装与配置是 Linux 系统运维和全栈开发的基础能力。在 Ubuntu 系统中,MySQL 的行为高度依赖发行版定制策略——尤其 Ubuntu 20.04 作为 LTS 版本,采用 MySQL 8.0 默认包,却保留大量 5.7 兼容性逻辑,导致字符集、认证插件、连接限制等关键配置极易偏离预期。理解 `bind-address`、`max_connections` 和 `innodb_buffer_pool_size` 等核心参数的默认值与生效机制,是避免 `Ac

weixin_30753873的博客 430

MySQL 5.5 在CentOS 7的完整部署、配置与运维实战指南

数据库作为信息系统的核心组件,其稳定运行依赖于合理的部署、配置与运维。以MySQL为代表的关系型数据库,通过其存储引擎、查询优化器等核心机制,管理着结构化数据,支撑着从Web应用到企业核心系统的各类业务。理解数据库的安装部署、参数调优与日常维护,对于保障数据安全与系统性能至关重要。尤其在处理历史遗留系统或特定稳定版本需求时,掌握特定版本如MySQL 5.5的部署技能,成为一项关键的工程实践能力。本文聚焦于在CentOS 7环境下,从零开始完成MySQL 5.5的安装,并深入解析其核心配置参数如innodb_

weixin_34025151的博客 492
上一篇: 面试官:RocketMq消费者是如何获取消息的?
下一篇: Redis指南【1】为什么时间选择了NoSQL?
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值