「一文搞懂」MySQL缓冲池(buffer pool)

一文了解MySQL的Buffer Pool 摘要:Innodb 存储引擎设计了一个缓冲池(Buffer Pool),来提高数据库的读写性能。 本文分享自华为云社区《MySQL 的 Buffer Pool,终于被我搞懂了》,作者:小林coding 。 今天就聊 MySQL 的 Buffer Pool,发车! 为什么要有 Buffer Pool? 虽然说 MySQL 的数据是存储在磁盘里的,但是也不能每次都从磁盘里面读取数据,这样性能是极差的。 要想提升查询性能,加个缓存就行了嘛。所以,当数据从磁盘中取出后,缓存内存中,下次查询同样的数据的 阅读详情

本章内容

缓冲池作用

buffer pool是MySQL中最重要的内存组件,介于外部系统和存储引擎之间的一个缓存区,其中可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),然后再以一定频率刷新到磁盘,从而减少磁盘 IO,加快处理速度。在缓冲池中不仅缓存了索引页和数据页,还包含了undo页、插入缓存(insert page)、自适应哈希索引以及InnoDB的锁信息等。

如图所示:

缓冲池设置

缓冲池的配置通过变量innodb_buffer_pool_size来设置,通常它的大小占用内存60%-80%,MySQL默认是134217728字节,即:128M。

-- 查看缓冲池大小
show variables like '%innodb_buffer_pool_size%';
-- 设置缓冲池大小
set persist innodb_buffer_pool_size=11274289152;

其中:11274289152 = 15(15G) * 0.7(70%) * 1024 * 1024 * 1024。

如何判断缓冲池的大小是否合理,可以通过:

  • show engine innodb status:如果free buffers值为0,表示缓冲池设置过小。
  • show status like '%buffer_pool_wait%':如果value值大于0,表示缓冲池设置过小。

缓冲池管理

缓冲池初始化

在MySQL启动时,InnoDB会为buffer pool申请一片连续的内存空间,然后按照默认的16KB的大小划分出一个个的页, buffer pool中的页就叫做缓存页。此时这些缓存页都是空闲的,之后执行增删改查操作时,才会加载磁盘中的数据页到buffer pool中。

为了更好的管理这些在buffer pool 中的缓存页,InnoDB为每一个缓存页的最前面都创建了一个内存大小一样的控制块,其中包括缓存页的表空间、页号、缓存页地址、链表节点等。

每一个控制块都对应一个缓存页,在分配控制块和缓存页后,剩余的空间不够一对控制块和缓存页的大小,就被称为碎片空间。

如图所示:

空闲页管理

buffer pool是一片连续的内存空间,当MySQL运行一段时间后,这片连续的内存空间中会同时存在空闲的缓存页和被使用的缓存页,为了能够快速找到空闲的缓存页,可以使用链表结构。MySQL将空闲缓存页的控制块作为链表的节点,这个链表称为Free链表(空闲链表)。

如图所示:

图中:

  • Free链表中除了有控制块,还有一个头节点,该头节点包含链表的头节点地址、尾节点地址以及当前链表中节点数量等信息,头节点是一块单独申请的内存空间(约占40字节),并不在buffer pool的连续内存空间中。
  • Free链表节点是一个一个的控制块,每个控制块包含着对应缓存页的地址,所以相当于 Free链表节点都对应一个空闲的缓存页。
  • 每个控制块中都包含指向上一个节点的pre指针、指向下一个节点的next指针以及一个数据页地址clt。

每当buffer pool中有一页数据空闲出来时,直接把该数据页的地址追加到Free链表中。

每当需要从磁盘中加载一个页到buffer pool中时,就从Free链表中取一个空闲的缓存页,并且将该缓存页对应的控制块的信息填上,然后把该缓存页对应的控制块从Free链表中移除。

脏页管理

设计buffer pool除了能提高读性能,还能提高写性能,更新数据时,不需要每次都将更新后的数据写入磁盘,而是将buffer pool对应的缓存页标记为脏页,然后再由后台线程将脏页写入到磁盘中。

为了能快速知道哪些缓存页是脏页,于是就设计出了Flush链表,与Free链表类似,Flush链表节点也是控制块,区别在于Flush链表的元素都是脏页。

如图所示:

有了Flush链表后,后台线程就可以遍历Flush链表,将脏页写入到磁盘中。

如何提高缓存命中率

由于buffer pool的大小有限,对于一些频繁访问的数据希望可以一直留在buffer pool中,对于那些很少访问的数据希望可以在某个时机可以淘汰掉,从而保证buffer pool不会因为内存不足而导致无法再缓存新的数据,同时还能保证常用数据留在buffer pool中。要实现以上功能,最容易想到的就是使用LRU(Least Recently Used)算法。

LRU算法的思路是链表头节点是最近使用的数据,链表尾节点是最久没被使用的数据。当空间不够时,就淘汰最久没被使用的节点,从而腾出空间。

LRU算法的实现思路:

如果访问的页在buffer pool中,则直接将该页对应的LRU链表节点移动到链表的头部。

如果访问的页不在buffer pool中,则除了要将页放入到LRU链表的头部,还要淘汰LRU链表末尾的节点。

LRU结构如图所示:

假如要访问3号页数据,因为3号页在buffer pool中,所以会把3号页移动到头部即可。

如图所示:

假如要访问9号页数据,但是9号页不在buffer pool中,所以需要淘汰5号页,然后在头部加入9号页数据。

如图所示:

至此,可以知道buffer pool中有三种页和链表来管理数据。

图中:

  • Free Page(空闲页):表示此页未被使用,位于Free链表。
  • Clean Page(干净页):表示此页已被使用,但是页面未发生修改,位于LRU链表。
  • Dirty Page(脏页):表示此页「已被使用」且「已经被修改」,其数据和磁盘上的数据已经不一致。当脏页上的数据写入磁盘后,内存数据和磁盘数据一致,那么该页就变成了干净页。脏页同时存在于LRU链表和Flush链表。

简单的LRU算法并没有被MySQL使用,因为简单的LRU算法无法避免下面这两个问题:

  • 预读失效。
  • buffer pool污染。

预读失效

程序是有空间局部性的,一般靠近当前被访问数据的数据,在未来很大概率会被访问到。所以,MySQL在加载数据页时,会提前把它相邻的数据页一并加载进来,目的是为了减少磁盘 IO。但是可能这些被提前加载进来的数据页,并没有被访问,相当于这个预读是白做了,这个就是预读失效。

如果使用简单的LRU算法,就会把预读页放到LRU链表头部,而当buffer pool空间不够时,会淘汰末尾的数据页。如果这些预读页一直不会被访问到,就会出现一个很奇怪的问题,不会被访问的预读页占用了LRU链表前排的位置,而末尾淘汰的页可能是频繁访问的页,从而大大降低了缓存命中率。

如何避免预读失效带来影响?

要避免预读失效带来影响,最好的方式就是让预读的页停留在buffer pool中的时间要尽可能的短,让真正被访问的页才移动到LRU链表的头部,从而保证真正被读取的热数据留在buffer pool中的时间尽可能长。

MySQL改进了LRU算法,将LRU划分为2个区域:young区域和old区域。

young区域在LRU链表的前半部分,old区域则是在后半部分。

old区域占整个LRU链表长度的比例可以通过变量innodb_old_blocks_pct来设置,默认为37,代表整个LRU链表中young区域与old区域比例为63:37。

-- 查看innodb_old_blocks_pc变量值
show variables like '%innodb_old_blocks_pc%';
-- 设置innodb_old_blocks_pc变量值
set persist innodb_old_blocks_pct = 40;

划分这两个区域后,预读的页就只需要加入到old区域的头部,当页被真正访问时,才将页插入young区域的头部。如果预读的页一直没有被访问,就会从old区域移除,这样就不会影响young区域中的热点数据。

示例:假设有一个长度为10的LRU链表,其中young区域占比70%,old区域占比30%。

如图所示:

现在有两个编号为20和21的页被预读了,这个页只会被插入到old区域头部,而old区域末尾的9和10号页会被淘汰掉。如果20和21号页一直没有被访问到,那么就不会占用young区域的位置,而且会给young区域的数据更早被淘汰。

如图所示:

如果20号页被预读后立刻被访问了,那么就会将它插入到young区域的头部,young区域末尾的页(7号)会被挤到old区域,作为old区域的头部,这个过程并不会有页被淘汰。

如图所示:

缓冲池污染

当某一个SQL语句扫描了大量数据时,在buffer pool空间比较有限的情况下,可能会将buffer pool中的所有页都替换出去,导致大量热数据被淘汰了,等这些热数据又被再次访问时,由于缓存未命中,就会产生大量的磁盘IO,MySQL性能就会急剧下降,这个过程被称为buffer pool污染。

注意, buffer pool污染并不只是查询语句查询出了大量的数据才出现,即使查询出来的结果集很小,但扫需要扫描很多页(如:全表扫描),也会造成buffer pool污染。

select * from t_user where name like "%nanqiu%";

可能这个查询出来的结果就几条记录,但是由于这条语句会发生索引失效,所以这个查询过程会全表扫描,接着会发生如下的过程:

  • 从磁盘读到的页加入到LRU链表的old区域头部。
  • 当从页中读取行记录时(即:页被访问时),就要将该页放到young区域头部。
  • 接下来拿行记录的name字段和字符串nanqiu进行模糊匹配,如果符合条件,就加入到结果集中。
  • 如此往复,直到扫描完表中的所有记录。

如何解决出现buffer pool污染而导致缓存命中率下降的问题?

像前面这种全表扫描的查询,很多缓存页其实只会被访问一次,但是它却只因为被访问了一次而进入到young区域,从而导致热点数据被替换了。

LRU链表中young区域就是热点数据,只要提高进入到young区域的门槛,就能有效地保证young区域中的热点数据不会被替换掉。

在MySQL中,进入到young区域条件增加了一个停留在old区域的时间判断。在对某个处在old区域的缓存页进行第一次访问时,就在它对应的控制块中记录下来这个访问时间:

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

这个间隔时间是由变量innodb_old_blocks_time控制,默认为1000ms。

-- 查看innodb_old_blocks_time变量值
show variables like '%innodb_old_blocks_time%';
-- 设置innodb_old_blocks_time变量值
set persist innodb_old_blocks_time  = 2000;

也就是说,只有同时满足「被访问」与「在old区域停留时间超过1秒」两个条件,才会被插入到young区域头部,这样就解决了buffer pool污染的问题 。

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

脏页何时会被刷入磁盘

引入了buffer pool后,当修改数据时,首先是修改buffer pool中数据所在的页,然后将其页设置为脏页,但是磁盘中还是原数据。因此,脏页需要被刷入磁盘,保证缓存和磁盘数据一致,但是若每次修改数据都刷入磁盘,则性能会很差,因此一般都会在一定时机进行批量刷盘。

如果在脏页还没有来得及刷入到磁盘时,MySQL突然宕机,不会造成数据丢失,因为InnoDB的更新操作采用的是Write Ahead Log策略(即:先写日志,再写磁盘),通过redo log日志让MySQL拥有了崩溃恢复能力。

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

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

在开启了慢SQL监控后,如果发现偶尔会出现一些用时稍长的SQL,这可能是因为脏页在刷新到磁盘时可能会给数据库带来性能开销,导致数据库操作抖动。如果间断出现这种现象,就需要调大buffer pool空间或redo log日志的大小。

缓冲池高并发

如果InnoDB存储引擎只有一个buffer pool,当多个请求同时进来时,为了保证数据的一致性(缓存页、Free链表、Flush 链表、LRU链表等多种操作),就必须给缓冲池加锁,保证同一时刻只有一个请求获得锁去操作buffer pool,其他请求只能排队等待锁释放,此时MySQL的性能就会变得非常低。

可以通过修改变量innodb_buffer_pool_instances给MySQL设置多个buffer pool来提升MySQL的并发能力。

innodb_buffer_pool_instances是一个持久化只读系统变量,需要授予persist_ro_variables_admin(启用持久化只读系统变量)和system_variables_admin(启用修改或保留全局系统变量)的权限。

-- 设置innodb_buffer_pool_instances变量值
set persist_only innodb_buffer_pool_instances=4;

修改完成后需要重启MySQL。

-- 查看innodb_buffer_pool_instances变量值
show variables like '%innodb_buffer_pool_instances%';

每个buffer pool负责管理自己的控制块和缓存页,有自己独立一套Free链表、Flush链表和LRU链表。

假设给buffer pool调整到16G(即:变量innodb_buffer_pool_size改为17179869184),此时,MySQL会为buffer pool申请一块大小为16G的连续内存,然后分成4块,接着将每一个 buffer pool的数据都复制到对应的内存块中,最后再清空之前的内存区域。这是相当耗费时间的操作。

为了解决以上问题,buffer pool引入chunk机制。每个buffer pool其实由多个chunk组成。每个chunk的大小由变量innodb_buffer_pool_chunk_size控制,默认值为128M。

-- 查看innodb_buffer_pool_chunk_size变量值
show variables like '%innodb_buffer_pool_chunk_size%';
-- 设置innodb_buffer_pool_chunk_size变量值
set persist_only innodb_buffer_pool_chunk_size  = 132417728;

变量innodb_buffer_pool_chunk_size和变量innodb_buffer_pool_instances一样,是一个持久化只读系统变量,修改完成后需要重启MySQL。

每个chunk就是一系列的描述数据块和对应的缓存页。

每个buffer pool中的所有chunk共享一套Free、Flush、LRU链表。

如图所示:

由于chunk机制的存在,通过增加buffer pool的chunk个数就能避免了上面说到的问题。当扩大buffer pool内存时,不再需要全部数据进行复制和粘贴,而是在原本的基础上进行增加内存。

chunk机制示例(chunk机制下,buffer pool如何动态调整大小):

调整前buffer pool的总大小为8G,调整后的buffer pool大小为16G。

由于buffer pool的实例数不可以变,因此,buffer pool从8G调整为16G是每个buffer pool增加2G的大小,此时只要给每个buffer pool申请(2048M/128M)个chunk就可以了,但是要注意的是,新增的每个chunk都是连续的128M内存。

缓冲池大小必须始终等于或者是innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的倍数。如果将缓冲池大小更改为不等于或等于innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的倍数的值,

则缓冲池大小将自动调整为等于或者是innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的倍数的值。

缓冲池示例

大量的全表扫描

如果在业务中做了大量的全表扫描,则可以将变量innodb_old_blocks_pct的设置减小,增大变量innodb_old_blocks_time的时长,不让这些无用的查询数据进入old区域,尽量不让缓存在young区域的有用的数据被立即刷掉。

-- 设置innodb_old_blocks_pct变量值
set persist innodb_old_blocks_pct=20;
-- 设置innodb_old_blocks_time变量值
set persist innodb_old_blocks_time=4000;

没有大量的全表扫描

如果在业务中没有做大量的全表扫描,则可以将innodb_old_blocks_pct增大,减小变量innodb_old_blocks_time的时长,让有用的查询缓存数据尽量缓存在innodb_buffer_pool_size中,减小磁盘IO,提高性能。

-- 设置innodb_old_blocks_pct变量值
set persist innodb_old_blocks_pct=37;
-- 设置innodb_old_blocks_time变量值
set persist innodb_old_blocks_time=1000;

【作者简介】

一枚热爱技术和生活的老贝比,专注于Java领域,关注【南秋同学】带你一起学习成长~

 

Mysql——》缓存池大小innodb_buffer_pool_size 在进行修改之前,需要根据服务器的内存大小和数据库负载情况确定合适的缓冲池大小。一般来说,建议将缓冲池设置为可用内存的 50% 到 80%。 阅读详情

相关推荐

MySQL参数 之 innodb_buffer_pool_size

Innodb_buffer_pool_size 《深入浅出MySQL》一文中这样描述Innodb_buffer_pool_size: 该参数定义了 InnoDB 存储引擎的表数据和索引数据的最大内存缓冲区大小。和 MyISAM 存储引擎不同,MyISAM 的 key_buffer_size只缓存索引键, 而 innodb_buffer_pool_size 却是同时为数据块和索引块做...

心有猛虎 细嗅蔷薇 1万+

【mySQL】提升mysql性能的关键参数之innodb_buffer_pool_size、innodb_buffer_pool_instances

转自:https://blog.youkuaiyun.com/qing_gee/article/details/42742241(作者太罗嗦了,复制好多遍) 提升mysql性能的关键参数之innodb_buffer_pool_size、innodb_buffer_pool_instances。 首先我们先看一下,我的电脑(i3-3220,4G内存,没有配置innodb_buffer_pool_size参数的情况下,抛开程序的性能,经过1个线程-8个线程的测试结果)环境下,大家可以看到如下的图,线程并发情况下,时间.

我的笔记本 1623

抖音风控参数逆向实战:从bd-ticket-guard-client-data到x-tt-session-dtrait的完整攻防解析

本文深入解析抖音风控参数逆向实战,重点剖析bd-ticket-guard-client-data和x-tt-session-dtrait的生成机制与破解方法。通过抓包调试、ECDH密钥生成、RSA与AES双层加密等技术手段,揭示抖音风控系统的核心逻辑,并提供实用的对抗策略与维护建议,助力开发者突破抖音风控限制。

weixin_30335575的博客 676

如何在MySQL中分配innodb_buffer_pool_size

如何在MySQL中分配innodb_buffer_pool_size innodb_buffer_pool_size是整个MySQL服务器最重要的变量。 1. 为什么需要innodb buffer pool? 在MySQL5.5之前,广泛使用的和默认的存储引擎是MyISAM。MyISAM使用操作系统缓存来缓存数据。InnoDB需要innodb buffer pool中处理缓存。所以非常需...

风中清淡 4517

C#连接数据库报Authentication to host ‘127.0.0.1‘ for user ‘root‘ using method ‘caching_sha2_password‘ fail

所以导致的,除了上边的办法,还可以把这个加密规则修改一下,这个的修改方式有很多,具体原因是因为MySQL8.0以前的加密规则是。

weixin_42209881的博客 4128

从零到一:手把手教你构建自定义ReaxFF力场参数

本文手把手教你从零构建自定义ReaxFF力场参数,详解反应力场的动态键序机制与参数化逻辑。通过LAMMPS实战演示,涵盖训练数据准备、参数优化算法选择及性能优化技巧,助力研究人员精准模拟化学反应过程。适用于材料科学、催化研究等领域,特别适合已掌握分子动力学基础的进阶用户提升力场开发能力。

weixin_28365523的博客 1057

mysql5.7 性能优化配置 innodb_buffer_pool_size

mysql5.7 性能优化配置 innodb_buffer_pool_size

1万+

STM32驱动电磁阀电路设计:从光耦选型到MOSFET驱动的实战解析

本文深入解析了STM32驱动24V电磁阀的完整电路设计,重点探讨了光耦选型与MOSFET驱动两大核心环节。针对电平转换与电气隔离需求,详细对比了EL357N与TLP2310等光耦在CTR、速度及耐压等关键参数上的差异与应用场景。同时,文章提供了MOSFET关键参数解读、驱动电路优化方案(如推挽驱动)以及完整的PCB布局、电源处理与调试避坑指南,旨在帮助工程师构建稳定可靠的工业控制电路。

weixin_29184371的博客 234

一文搞懂 MySQL InnoDB架构 Buffer Pool、Change Buffer、自适应哈希索引、Log Buffer

从 Redis 的第一人称视角出发,拟人故事化方式和诙谐幽默的言语与各路“神仙”对话,配合 158 张图,由浅入深循序渐进的讲解 Redis 的数据结构实现原理、开发技巧、运维技术和高阶使用,让人轻松愉快地学习。在磁盘上,Change Buffer 属于系统表空间的一部分,当数据库服务器关闭时,索引变更将在此处缓冲存储。当其他操作将受影响的页读入 Buffer Pool 时,随后将缓存的更改合并,避免了从磁盘读取二级索引页至 Buffer Pool 所需的大量随机访问 I/O。"运维总监瘫坐在监控屏前!

码哥字节 1239

嵌入式开发 DSP芯片运行方式(挖坑-填坑中-坑已平 :))

TMS320F28335 DSP 芯片 如何将运行代码放在不同的位置

FOOLCODE的专栏 1306

第1章>>1.5:神电测控为什么开发LabVIEW ZYNQ FPGA软件工具包?(ZYNQ芯片的特点与优势)《LabVIEW ZYNQ FPGA宝典》

ZYNQ是赛灵思公司(Xilinx)推出的新一代全可编程片上系统(APSoC,All-Programmable SoC),它将处理器的软件可编程性与FPGA的硬件可编程性进行完美整合,以提供无与伦比的系统性能、灵活性与可扩展性。Zynq-7000系列是Xilinx于2010年4月推出的行业第一个可扩展处理平台,旨在为视频监视、汽车驾驶员辅助、工厂自动化、医疗器械等高端嵌入式应用提供所需的处理能力与计算性能。这款基于ARM处理器的SoC可满足复杂嵌入式系统的高性能、低功耗和多核处理能力等要求。

qq_40694786的博客 1646

MySQL 的 Buffer Pool,终于被我搞懂了

大家好,我是小林。 今天就聊 MySQL 的 Buffer Pool,发车! 为什么要有 Buffer Pool? 虽然说 MySQL 的数据是存储在磁盘里的,但是也不能每次都从磁盘里面读取数据,这样性能是极差的。 要想提升查询性能,加个缓存就行了嘛。所以,当数据从磁盘中取出后,缓存内存中,下次查询同样的数据的时候,直接从内存中读取。 为此,Innodb 存储引擎设计了一个缓冲池(Buffer Pool),来提高数据库的读写性能。 有了缓冲池后: 当读取数据时,如果数据存在于 Buffer Pool

小林coding 8037

QGIS之七建筑面由DSM和DEM获取高度并可视化

QGIS建筑面由DSM和DEM获取高度并可视化

yilvyangguang520的博客 3511

一文搞懂MySql的Buffer Pool

所以如果使用简单的LRU链表机制,其实是漏洞百出的。因为预读机制、全表扫描会把未来并不经常访问的数据页加载到缓存页里,从而导致那些频繁被访问的缓存页不得不处于LRU链表尾部。如果此时恰好需要把一些缓存页刷入磁盘或者清空以腾出空闲的缓存页,那么就会把频繁被访问的缓存页给清空了。

2301_76166241的博客 1542

9、 量子支持向量机:从经典到量子的跨越

本文详细介绍了量子支持向量机(QSVM)的基本原理及其在PennyLane和Qiskit框架中的实现方法。从经典SVM的基础知识出发,逐步深入到量子领域的应用,包括如何定义量子核函数、与scikit-learn集成以及在模拟器和实际量子计算机上的训练和评估过程。最后通过表格和流程图总结了不同框架下的实现要点,为未来量子机器学习的研究提供了参考。

weixin_42433737的博客 184

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

一文吃透MySQL InnoDB内存架构:从Buffer Pool到Log Buffer的核心原理

本文深入解析MySQL InnoDB存储引擎的内存架构,重点剖析四大核心组件:Buffer Pool(缓冲池)作为主战场缓存数据页,Change Buffer(更改缓冲区)优化二级索引DML操作,Adaptive Hash Index(自适应哈希索引)自动加速热点查询,以及Log Buffer(日志缓冲区)保障事务持久性。文章详细阐述了各组件的工作原理、调优参数及适用场景,并提供了内存与磁盘联动的整体视角。最后给出针对不同业务场景的调优实战指南,包括缓冲池大小设置、日志刷盘策略选择等关键优化建议,帮助读者全

CharlesYuangc的博客 548

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

面试官:innodb_buffer_pool_size 设多大?别只说 80%!

简单来说,Buffer Pool 是 InnoDB 在内存中开辟的一块区域,用于缓存磁盘上数据文件(.ibd文件)中的数据页(Data Pages)和索引页(Index Pages)。想象一下你要频繁地从一个巨大的图书馆(磁盘)里查找资料(数据页/索引页每次需要资料,你都得亲自跑到图书馆深处,找到书架,拿出书,看完再放回去。这个过程非常耗时(磁盘 I/O)。你在图书馆入口处有一张大书桌(内存中的 Buffer Pool当你第一次拿到一本常用的书后,你不把它立刻放回书架,而是放在书桌上。

郑龙飞 1290

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

MySQL冷启动效应剖析:从Buffer Pool到慢查询的复活陷阱

数据库重启或容器重建后,服务刚恢复却迎来慢查询和超时告警的集中爆发,这种看似随机且短暂的现象,往往根植于底层缓存系统的冷启动效应。MySQL的性能依赖于多层热状态的协同,包括InnoDB Buffer Pool、操作系统Page Cache以及数据字典与统计信息。当这些缓存层因重启而失效或空白,原本毫秒级完成的查询需要经历多次磁盘随机读、redo日志重放、连接池重建乃至锁等待队列积压,整体延迟飙升数十倍。理解这一原理后,可通过开启缓冲池转储与加载、合理配置IO容量、设计流量梯度放量等预热与治理手段,有效缓解

weixin_30402231的博客 300

InnoDB Buffer Pool 内部结构与性能调优实战

在数据库性能优化中,缓存机制是决定系统吞吐量的关键环节。MySQL 作为主流关系型数据库,其默认存储引擎 InnoDB 依赖 Buffer Pool 在内存与磁盘之间建立高速缓冲层,以显著降低随机 I/O 开销。理解 Buffer Pool 的物理布局、数据页生命周期以及三大链表(free、LRU、flush)的协作原理,是定位性能瓶颈的基础。同时,LRU 算法的冷热分区设计有效避免了全表扫描造成的缓存污染,而 page hash 与自适应哈希索引则进一步加速了页的查找效率。合理配置 innodb_buff

weixin_29212867的博客 100

MySQL性能调优:彻底搞懂Buffer Pool与Change Buffer的协同机制

数据库性能优化的核心往往在于如何化解磁盘随机IO与内存访问速度之间的巨大鸿沟。InnoDB存储引擎通过内存缓冲池缓存热数据页,显著提升读性能;同时借助变更缓冲机制延迟合并二级索引的写操作,减少高频写入时的磁盘开销。理解缓冲池的改良LRU链表、脏页刷盘策略以及变更缓冲的触发时机,是定位MySQL慢查询与性能尖刺的关键。本文从缓存原理出发,结合真实工程案例,解析这两个机制如何协同工作,并给出参数调优与监控的实践建议,帮助后端开发与DBA从底层IO模式出发解决性能瓶颈。

weixin_31240035的博客 290

MySQL内存占用过高排查:从缓冲池到performance_schema实战指南

数据库内存管理是运维和开发绕不开的课题,尤其是在高并发、大数据量场景下,MySQL实例内存持续走高会直接影响业务稳定性。理解MySQL的内存模型,掌握innodb_buffer_pool_size、连接级排序缓存、临时表等核心参数的分配原理,是定位内存问题的关键。借助performance_schema与sys库,可以按内存事件定位占用热点,并区分是合理缓存、会话级突发分配还是监控结构累积。当实例内存飙升、swap频繁触发时,通过量化配置、观察高水位、对比当前与历史分配数据,就能快速找到元凶。本文结合实际案

weixin_31412781的博客 77

一次线上故障带你看懂 MySQL InnoDB 缓冲池

简单来说:Buffer Pool 是 InnoDB 的内存缓存区。缓存数据页缓存索引页减少磁盘 IO提高查询性能MySQL 的数据最终存储在磁盘中。但磁盘随机读取速度远低于内存。因此 InnoDB 会把热点数据提前加载到 Buffer Pool 中。如果数据已经在 Buffer Pool 中 → 直接读取内存如果不在 → 从磁盘加载Cache Hit(缓存命中)Cache Miss(缓存未命中)通常线上高性能 MySQL:99% 以上。

Ki97M18WT的博客 250

MySQL 中的逻辑读与物理读:深入理解 InnoDB 的 I/O 行为

定义:从InnoDB 缓冲池(Buffer Pool)中读取数据页的操作。特点不涉及磁盘 I/O;速度极快(内存访问,纳秒级);是数据库高效运行的关键。别名:也称为“缓存命中读”或“内存读”。对比项逻辑读物理读来源Buffer Pool(内存)磁盘/SSD速度极快(ns 级)慢(ms 级)性能影响正向(高效)负向(瓶颈)优化目标最大化最小化核心思想让数据尽可能“待在内存里”,减少去磁盘“跑腿”的次数。

Java架构师之路的博客 559
上一篇: Nacos服务注册源码解析
下一篇: Nacos健康检查机制
南秋同学
博客等级 码龄7年 64粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值