MySQL源码学习:简述InnoDB的BP LRU策略

本文简要说明InnoDB的Buffer Pool(BP)的结构、基本运行方式和策略。

 

1、LRU的基本形态

       由于涉及到淘汰机制,Buffer Pool (BP)内需要一个LRU链。这个LRU链表的基本形态如下:

 

 

 

从图中看到,LRU是一个链表(双向,图中没有画出反向指针)。

同时有一个LRU_old(buf_pool->LRU_old)指针指向链表中间的一个page。 LRU_old指向的page及之后直到end的page,都被称为”old page”, 内存中bpage->old==1。

       LRU_old之前到start的所有page,被称为”young page”, 内存中bpage->old==0.

 

2、 从头开始

     a)     在系统初始化时,所有的page都是空闲的,因此全部放在buf_pool->free链表中,此时buf_pool.LRU={count = 0, start = 0x0, end = 0x0}, 当然buf_pool->LRU_old=0x0.

     b)     当有page请求时,从buf_pool->free中取出page,放入LRU中。需要注意的是,在LRU->count小于512(BUF_LRU_OLD_MIN_LEN)时,所有的page都被标为young,插入队头。

     c)     当LRU->count达到512时候,依次作如下动作

          i.     将buf_pool->LRU_old, 赋值为LRU.start, 将LRU中的所有page都设置为old (buf_LRU_old_init)

          ii.       调用buf_LRU_old_adjust_len,调整buf_pool->LRU_old的适当位置,成为上图的基本形态。默认配置下old page数目占3/8. 

     d)     有新的page再进入LRU时,先插入到LRU_old的next位置,也就是先标为old,下次访问时再调整为LRU.start,再改为young。

     e)      当BP满了以后,即LRU.count为page总数,再需要访问新的page时,就只能从LRU末尾删除,再补入。

 

3、 一点讨论

1) 步骤d中所说的”下次访问”,实际上在放入LRU之后马上会发生。在buf_page_get_gen 调用 buf_page_set_accessed_make_young,若满足条件则将此page调整为LRU.start。

需要说明一个参数buf_LRU_old_threshold_ms。当一个old page距第一次被访问的时间大于等于buf_LRU_old_threshold_ms时,再次被访问的时候,就会被调整为LRU.start.

也就是说,当buf_LRU_old_threshold_ms为默认设置的0时,新插入的page都是先放到LRU_old之后,马上被调整到LRU.start。

而这个“调整”,也不是简单的指针重赋,而是将这个page 从LRU中移除,再插入到LRU头部。而从LRU中删除page的时候,若刚好碰到临界值(<512),会遍历整个队列,全部设置为young。

虽然都是内存操作,但整个过程显得比较粗暴。大多数的系统中并不会修改buf_LRU_old_threshold_ms的默认值,因此这个过程则一直在被重复调用。

实际上,在第一次访问page需要入LRU队列的时候,完全可以先判断一下buf_LRU_old_threshold_ms的值,若为0,则直接插入到LRU头部。对应的代码在buf_page_init_for_read中的两处调用buf_LRU_add_block(bpage, TRUE)。

 

2) 当前的调用流程

    buf_page_set_accessed_make_young(&block->page, access_time);  -->     buf_LRU_make_block_young --> buf_LRU_remove_block(bpage); buf_LRU_add_block_low(bpage, FALSE);

 

4、 一点声明

本文基本上是为下周组里要来的小实习生作个介绍,因此写得又细又浅,欢迎拍砖。可以踩,但请果断留下意见。

MMI分束器仿真优化:用Lumerical FDTD实现95%耦合效率的实战技巧 本文详细介绍了使用Lumerical FDTD软件对MMI分束器进行仿真优化的实战技巧。通过构建高保真模型、精确配置光源与边界条件,并重点优化波导结构与taper设计,系统性地将器件的耦合效率提升至95%以上。文章还分享了利用参数扫描、varFDTD加速等高级方法,帮助硅光芯片设计工程师高效实现高性能MMI分束器设计。 阅读详情

相关推荐

保姆级教程:在RK3568 Debian系统上搞定AIC8800 WiFi与蓝牙驱动(含固件路径与开机自启脚本)

本文提供在RK3568 Debian系统上配置AIC8800 WiFi与蓝牙驱动的保姆级教程,涵盖驱动移植、固件部署、开机自启脚本等关键步骤。通过详细的硬件连接指南、内核配置示例和常见问题解决方案,帮助开发者快速实现无线模块的全功能配置,特别适合嵌入式Linux开发者参考。

weixin_28684825的博客 380

Mysql InnoDB的内存管理--LRU链表

Mysql Innodb Buffer Pool的LRU设计思路: 1.InnoDB把整个LRU链表按照5:3的比例(由参数innodb_old_blocks_pct控制)分为old区域和new区域,其中LRU_OLD占5/8,LRU_NEW占3/8 2.如果要访问一个不在当前链表里的数据页时,新的数据页会插入到LRU_OLD的队首,如果链表满的话,会从LRU_OLD的队尾相应的淘汰掉一个...

jzzw的博客 1370

2025东三省D题深圳杯数学建模实战解析:基于多模型融合的法医STR混合样本智能识别系统

本文深入解析了2025年东三省数学建模竞赛D题,即深圳杯赛题,聚焦于法医STR混合样本的智能识别挑战。文章系统阐述了构建一个基于多模型融合的智能识别系统的完整流程,涵盖贡献者人数判定、DNA贡献比例估计、个体基因型推断以及STR谱图去噪四大核心步骤。通过融合高斯混合模型、随机森林、非负矩阵分解、小波变换与深度学习等多种技术,并强调特征工程的重要性,为破解法医DNA混合样本分析这一行业难题提供了清晰的数学建模与AI实战思路。

weixin_29050271的博客 392

Cache Invalidation

Learn how。

maxzcl的博客 505

Python爬虫:无账号无限制获取企查查信息

无限制企查查爬虫 ​通过网上爬虫获取了全国所有企业,然后就需要补充企业信息,首先想到的就是企查查,启信宝等专业网站,最终选择了企查查,尝试了多种方法: 1、selenium爬虫,绕过企查查的登录验证,但账号和IP限制太大,最终放弃 2、通过requests直接请求+cookies,遇到了cookie有效期和限制问题 不断的尝试和修改参数,最终发现一种有效方式selenium+ wep 只需要IP代理,不需要账号,没有限制,因为是没有登录,拿到的信息有限,能展示的都能获取。 一、初始化..

攻城狮的家园 1万+

Geant4 案例分析(一): B1

本文是对Geant4 B1的案例分析,其中特定的功能不做介绍,而注重于各个文件的主要功能,以及它们组织的方式。

m0_51809467的博客 1583

7K字揭秘InnoDB缓冲池:MySQL中的数据缓存利器

InnoDB是基于磁盘存储的,并将其中的数据按页的方式进行管理。因此InnoDB可视为基于磁盘的数据库系统。为了缓解 CPU 与磁盘速度之间的矛盾,基于磁盘的数据库系统通常使用缓冲池技术来提高数据库的整体性能。缓冲池其实就是一块内存区域,没什么特别的。缓冲池(Buffer Pool)的默认大小为 128M,可通过 innodb_buffer_pool_size 参数来配置。如果大部分都是 InnoDB表,InnoDB 缓冲池或许比其他任何东西更需要内存。

wdj_yyds的博客 306

新手避坑指南:用COMSOL Multiphysics仿真气体放电(汤逊vs.流注)

本文详细介绍了使用COMSOL Multiphysics仿真气体放电的实战指南,涵盖汤逊理论和流注模型的实现方法。通过对比两种放电模型的关键参数和物理场配置,帮助新手避免常见错误,准确预测气体击穿过程。文章还提供了工程应用案例,如高压绝缘子设计优化,展示了仿真技术在电力设备绝缘设计中的实际价值。

weixin_28716181的博客 477

mysql lru_Mysql缓存-全表扫描过程、LRU算法

在日常开发中,常因为分页查询的使用,或者SQL的语法问题导致的全表扫描,这带来的问题可能会有系统的OOM,频繁的GC,以及慢SQL,数据返回慢等问题。那么我们如果光从内存这个角度看这个全表扫描的问题,他是怎么样进行查询返回结果的呢?假设我的主机内存就几个G,但是全表的数据可能是它的几倍,那么机器的内存会直接用光吗?结合日常的开发工作,对大表做全表扫描,看来应该是没问题的(只看数据而言)。但是,这个...

weixin_29602351的博客 344

MATLAB算法实战应用案例精讲-【数模应用】装箱问题

装箱问题可以根据不同的维度进行分类。以下是一些常见的装箱问题二维装箱问题:二维装箱问题假设所有物品都是平面上的矩形,并且需要将它们放入平面上的容器中。这个问题的目标是找到一种装箱方案,使得物品不重叠并占据的总面积最小。三维装箱问题:三维装箱问题考虑到物品可以具有高度,并且需要将它们放入三维容器(如箱子或货柜)中。目标是找到一种装箱方案,使得物品不重叠且总体积最小。多维装箱问题:多维装箱问题是指在更高维度空间中进行装箱的问题。除了长度和宽度之外,物品可能具有其他属性,如高度、重量、形状等。

qq_36130719的博客 1572

YOLOv8改进:全网原创首发 | 新颖的多尺度卷积注意力(MSCA),即插即用,助力小目标检测 | NeurIPS2022

多尺度卷积注意力(MSCA),有效地提取上下文信息;1)作为注意力MSCA使用;

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 3844

Mysql——LRU链表

目录一、LRU链表的概述二、LRU链表的处理逻辑三、LRU链表的优缺点四、预读的概述五、预读的分类(根据触发方式分类)六、造成Buffer Pool命中率低的原因七、Buffer Pool命中率低的解决方式八、对于简单LRU链表的缺点优化 一、LRU链表的概述 LRU = Least Recently Used(最近最少使用); 由于缓冲区空间有限,如果满了,则需要把旧的移除掉,新的加进来; 把使用频繁的数据保留在缓存中,把使用频率低的数据移除; 用来记录缓冲页的被使用热度; Buffer Pool的缓冲

小志的博客 2564

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

MySQL InnoDB Buffer Pool:从页面淘汰到预热策略的底层逻辑

Buffer Pool 是 InnoDB 性能的基石。其改良 LRU 分代机制通过 Young/Old 区隔离冷热数据,控制晋升门槛,有效抵御全表扫描污染。生产调优的核心不是盲目调大 Buffer Pool,而是:合理分配物理内存比例、根据数据规模选择实例数、利用预热策略缩短冷启动窗口、通过精确控制淘汰行为。所有参数调整应以和为量化依据,而非经验猜测。

guoyizhongxing的博客 5128

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

面试官:MySQL数据查询太多会OOM吗,2024年最新互联网大厂面试官

终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!18)]

2401_84006689的博客 951

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【云栖神侠传】---阿里云丁奇带你走进MySQL的世界

何为云栖神侠?互联网江湖门派风起云涌。 “A"门派在纷争不断的业界,声名显赫! 在“A"门派中,有一个世外桃源名叫“云栖社区”。 在云栖社区中,云集了众多“A"门派高手,他们功力深厚且行侠仗义,助人为乐。他们被称为“云栖神侠”。 云栖社区,是阿里云面向开发者群体的开放型社区。在云栖社区中,活跃着许多阿里技术大牛,他们在自己的技术领域都是佼佼者,具有一定...

weixin_33878457的博客 157

[MySQL学习] 一个压缩Page从磁盘读入buffer pool的过程

以下是边看代码边记录的,从磁盘读取一个压缩Page到buffer pool的的全过程,以函数buf_page_get_gen作为入口 buf_page_get_gen 1.根据space和offset来计算请求的page是否已经读到了buffer pool中 fold = buf_page_address_fold(space, offset);...

weixin_34381666的博客 503

innodb中master线程的调度的算法改进(mysql 5.6.26)

innodb中master线程的调度的算法改进(mysql 5.6.26) 作者:周琳 QQ:715169549 源码交流群:196380905 1.master线程的调度: /**********************************************

innobase的博客 361

mysql的LRU队列详解

MySQL的缓冲池(innodb_buffer_pool_instances,innodb_buffer_pool_size)是通过LRU算法来进行管理的。即最频繁使用的页在LRU列表的最前端,而最少使用的页在LRU列表的尾端。当缓冲池不能存放新读取到的页时,将首先释放LRU列表尾端的页。 在INNODB引擎中,缓冲池页的大小默认为16KB。 在INNODB引擎中,有一个midpoint位置。新读取到的页,虽然是最新访问的页,但并不直接放到LRU队列的首部,而是放到...

Uncle.Cui的技术博客 1838

MySQL 之LRU 缓存管理算法

在 MySQL 中,特别是针对 InnoDB 存储引擎,LRU(Least Recently Used 最近最少使用)算法用于管理缓冲池中的数据页

XT4625的专栏 1244

MySQL中的free链表,flush链表,LRU链表

你在执行增删改的时候,如果发现数据页没缓存,那么必然会基于free链表找到一个空闲的缓存页,然后读取到缓存页里去,但是如果已经缓存了,那么下一次就必然会直接使用缓存页。反正不管怎么样,你要更新的数据页都会在Buffer Pool的缓存页里,供你在内存中直接执行增删改的操作。接着你肯定会去更新Buffer Pool的缓存页中的数据,此时一旦你更新了缓存页中的数据,那么缓存页里的数据和磁盘上的数据页里的数据,是不是就不一致了?这个时候,我们就说缓存页是脏数据,脏页。

weixin_55229531的博客 5万+

mysql lru_浅析MySQL的lru链表

一、简述传统的LRU链表LRU:Least Recently Used相信大家对LRU链表是不陌生的,它算是一种基础的数据结构吧,而且想必面试时也被问到过什么是LRU链表,甚至是让你手写一个LRU链表。想必你已经知道了MySQL的Buffer Pool机制以及MySQL组织数据的最小单位是数据页。并且你也知道了 数据页在Buffer Pool中是以LRU链表的数据结构组织在一起的。其实所谓的LRU...

weixin_32770297的博客 1292

(五)大白话MySQL的Buffer Pool的free链表、flush链表、LRU链表

MySQL的Buffer Pool的free链表、flush链表、LRU链表

zht245648124的博客 2306

10-MySQL的LRU算法优化

冷数据区域的缓存页会在加载后至少1秒钟才会根据访问情况考虑迁移到热数据区域。这样避免了短期访问就造成不必要的迁移,确保了缓存区域的稳定性和性能。这就是LRU链表冷热数据分离的一套机制。通过这些学习,我们已经深入理解了LRU链表的设计机制以及冷热数据分离的原理。冷数据区域的设计当数据页刚被加载到缓存中时,它会首先进入冷数据区域的链表头部。如果在加载后1秒内没有被访问,它会留在冷数据区域,成为冷数据。热数据区域的设计。

ProSayJ的博客 2173

(六)大白话MySQL是如何基于冷热数据分离的方案,来优化LRU算法?

MySQL是如何基于冷热数据分离的方案,来优化LRU算法

zht245648124的博客 2223

MYSQL部分术语及原理解释(缓冲池、LRU、redo log buffer、WAL、Checkpoint、LSN)

总结来自《MySQL技术内幕 InnoDB存储引擎》 第二版。

rachel_2016的博客 1000
上一篇: MySQL源码学习:ib_logfile、bin-log与主从同步
下一篇: MySQL中varchar最大长度是多少?
iteye_621
博客等级 码龄8年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值