mysql 空闲链表 Lru 链表 脏页链表 原理

MySQL 缓冲区 17 InnoDB缓冲区 缓存 对于InnoDB存储引擎来说,我们存储的用户数据及索引(聚簇索引、普通索引)、各种的系统数据都是以页的形式存储在表空间中,而表空间是InnoDB对文件的抽象,这些数据实际都是存储到磁盘中的。 我们知道跟CPU的速度相比,磁盘的速度是很慢的,所以InnoDB在处理客户端的请求时(比如查看记录),需要将磁盘中的对应的页加载到内存中,将整个页加载到内存后,进行读写操作,完成操作后并不会立刻将这个页对应的内存空间释放掉,而是缓存起来,当下一次访问到这个页面时,也就可以直接访问内存中 阅读详情

MySQL 的存储引擎,特别是 InnoDB,使用各种链表来管理和优化其内部操作。让我们详细探讨一下你提到的这三种链表:空闲链表、LRU链表和脏页链表。

  1. 空闲链表 (Free List)

    • 原理:空闲链表是 InnoDB 用于跟踪哪些数据页是空闲的(即,它们不包含有效数据,可以被重用)的链表。当需要一个新的数据页时,InnoDB 会从空闲链表中获取一个。
    • 作用:提高数据页分配的效率。如果没有空闲链表,InnoDB 可能需要扫描整个缓冲池来找到一个空闲的数据页,这会导致性能下降。
    • 被哪些功能使用:当需要分配一个新的数据页时,例如插入新记录时,空闲链表会被使用。
  2. LRU链表 (Least Recently Used List)

    • 原理:LRU 链表是 InnoDB 缓冲池中的一个重要组件,用于跟踪最近最少使用的数据页。当需要为新数据腾出空间时,InnoDB 会从 LRU 链表的末尾淘汰最近最少使用的数据页。
    • 作用:确保缓冲池中的数据页是“热点”数据页,即最近经常被访问的数据页。这有助于提高查询性能,因为最近被访问的数据页更有可能仍然在缓冲池中。
    • 被哪些功能使用:当缓冲池空间不足,需要淘汰某些数据页时,LRU 链表会被使用。此外,InnoDB 的各种优化策略,如预读和刷新,也会考虑 LRU 链表的状态。
  3. 脏页链表 (Dirty List)

    • 原理:脏页链表跟踪在缓冲池中已经被修改但尚未写回到磁盘的数据页。这些页被称为“脏页”,因为它们的内容与磁盘上的数据不同。
    • 作用:脏页链表帮助 InnoDB 知道哪些数据页需要写回到磁盘,从而保持数据的一致性。同时,它还可以帮助优化写操作,例如通过批量写回多个脏页来减少I/O操作。
    • 被哪些功能使用:当需要刷新脏页到磁盘时,或者当系统空闲时尝试进行后台写操作时,脏页链表会被使用。此外,某些操作,如事务提交,也可能导致脏页链表的变化。

了解这些链表的原理和作用,可以帮助你更好地理解和优化 InnoDB 的性能和行为。

说一说Mysql缓存池BufferPool基本原理 前言: 最近面试了一些个5年8年的程序员,普遍发现了一个问题,底层的基本原理知道的少之又少,只停留在CRUD。其实还是很建议每一位同学关注一些底层的实现原理,当然不是要自己再造轮子,而是学习别人想法的同时当你了解他的底层的实现原理,在编写代码中才能把你的代码写的更优更健壮。 废话到此结束 开始正题~~~~ 一、为什么要有缓存池 我们在使用sql查询的时候,都应该会发现一个问题,第一次对于数据查询的时候(数据量w级别无索引),查询速度可能在秒级别,而再进行第二次第三次查询的时... 阅读详情

相关推荐

MySQL-Buffer的应用

InnoDB 存储引擎在处理客户端的请求时,当需要访问某个页的数据时,就会把完整的页的数据全部加载到内存中,也就是说即使我们只需要访问一个页的一条记录,那也需要先把整个页的数据加载到内存中。将整个页加载到内存中后就可以进行读写访问了,在进行完读写访问之后并不着急把该页对应的内存空间释放掉,而是将其缓存起来,这样将来有请求再次访问该页面时,就可以省去磁盘 IO 的开销了。

张姐姐聊编程 1528

Mysql——LRU链表

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

小志的博客 2564

知识推理——TransE(知识表示、知识嵌入)

知识图谱嵌入/表示方法 TransE

missyoudaisy的博客 1831

buffer pool内存结构、LRU、刷脏页机制详解

innodb内存结构和物理磁盘结构 其中innodb内存结构包括3个大块: 1.buffer pool 2.change buffer(实际上是bufferpool的一部分) 3.log buffer。日志缓冲 (这只是innodb端的内存,如查询缓存、binlogcache、readbuffer、sortbuffer、joinbuffer、keybuffer、tmp_table_size等等不在列) (自适应索引是一个功能,在bufferpool中自动生成hash索引)...

liuzhilong的博客 2534

AI驱动的CNC闭环加工系统:边缘实时控制与IIoT反馈实践

闭环控制是工业自动化的核心概念,指通过实时反馈调节系统输出以逼近目标值;其技术原理在于构建短于被控对象时间常数的确定性反馈链路,从而保障动态响应精度与稳定性。在智能制造落地中,AI正从离线分析工具演进为嵌入式实时决策单元,其核心价值在于将工艺知识模型化、控制指令轻量化、执行路径边缘化。典型应用场景包括CNC加工过程中的振动自适应调参、刀具磨损在线补偿及多机协同优化。本实践聚焦FANUC 0i-MF平台,基于Modbus TCP硬实时通信与轻量LSTM+CNN融合模型,实现217毫秒级AI推理与PMC寄存器直

weixin_29704001的博客 323

电池管理系统(BMS)系列(四)—数据采集之温度

属于BMS系列文章,介绍了电池包温度采集相关方式

zxx52113140的博客 5456

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

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

weixin_55229531的博客 5万+

蓝牙抓包实战:用nrf52840和Wireshark解析广播包与SCAN_RSP的完整流程

本文提供了一份完整的蓝牙抓包实战指南,详细介绍了如何使用nRF52840 Dongle和Wireshark捕获并解析蓝牙广播包与SCAN_RSP。内容涵盖环境搭建、广播事件分析、数据包结构拆解以及常见连接问题的调试技巧,旨在帮助开发者和物联网工程师深入理解BLE底层通信,提升硬件调试能力。

weixin_29279153的博客 494

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

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

zht245648124的博客 2306

CloudCompare 二次开发(36)——非均匀体素降采样

使用CloudCompare与PCL编程实现的非均匀体素降采样。

点云侠的博客 745

【Segment Anything Model】三:SAM模型微调自定义数据集,更改混合提示方式:点,框,点框混合

1.微调SAM预备知识。

cvxiayixiao的博客 1万+

10-MySQL的LRU算法优化

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

ProSayJ的博客 2173

【CANdelaStudio编辑CDD】-21.2-创建OBD诊断$03,$07,$0A和$04服务以及OBD DTC

案例背景(共11页精讲):创建OBD诊断$03,$07,$0A和$04服务;以及OBD DTC。 在《【ISO15031_OBD诊断】-3.1-$03服务Request emission-related diagnostic trouble codes理论部分https://blog.youkuaiyun.com/qfmzhu/article/details/122157513》, 《【ISO15031_OBD诊断】-7.1-$07服务Request emission-related diagnostic trou

「汽车电子助手」的博客 1697

mysql原理--InnoDB的Buffer Pool

Buffer Pool,用户态高速缓存

x13262608581的博客 2285

华为OD机试真题 新系统【网络数据包收发处理】

华为OD机试 新系统真题【网络数据包收发处理】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【网络数据包收发处理】多语言题解。

qq_45776114的博客 444

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

深度整理总结MySQL——Buffer Pool工作原理

用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cache)里,避免每次都去访问数据库。操作系统,会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据的访问。MySQL作为一个存储系统,同样具有缓冲池(buffer pool)机制,以避免每次查询数据都进行磁盘IO。uffer Pool 是在 MySQL 启动的时候,向操作系统申请的一片连续的内存空间,默认配置下 Buffer Pool 只有 128MB。不过你可以根据参数来设置Buffer Pool 的大小.

左灯右行的爱情 1684

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

MySQL InnoDB 缓存池(Buffer Pool)详解:原理、结构与链表管理

MySQL InnoDB 缓存池(Buffer Pool)是内存中用于缓存数据页的关键区域,通过内存换时间缓解磁盘瓶颈。它包含数据页、索引页等,通过控制块管理。核心管理机制包括三条链表:空闲链表(Free List)记录可用缓存页,LRU链表管理已载入页的替换策略,Flush链表跟踪待刷盘的脏页。读操作通过哈希表快速判断缓存命中,写操作先在内存修改形成脏页再异步刷盘。InnoDB还优化了传统LRU算法,通过分区解决预读失效和缓存污染问题。整体上,缓存池显著提升了数据库的读写性能。

weixin_43829708的博客 1157

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

innodb的buffer pool原理

说明:下文基于innodb存储引擎介绍!!! 一、什么是buffer pool 我们知道对于MySQL数据库,是将数据以页的方式存放在磁盘上的。我们也知道对于磁盘的操作是非常慢的,如果我们需要查询某些数据时CPU都是从磁盘上去将这些数据读取出来然后返回给我们,那么这种效率肯定是低的让人奔溃的。那么MySQL采用了什么手段来提高数据读取效率呢?这就是buffer pool技术。顾名思义buffer pool就是内存缓冲池的意思,也就是使用内存来提高CPU和磁盘的交互效率。 在MySQL启动时就会向操作系统申

wenpan的博客 1134

深入理解InnoDB的Buffer Pool

InnoDB是通过页来管理数据的,页是存放在表空间中,表空间说白了就是对数据文件的抽象,数据始终是存储在磁盘上的,如果每次CRUD的操作都要和磁盘进行IO交互,那MySQL的性能将会大打折扣,吞吐量页没法保证。此时InnoDB就需要引入一个Buffer缓冲区来优化这个问题,当客户端要访问某个页面或者数据时,可以直接从Buffer缓冲区中快速读取,这个缓冲区是在内存中的,速度不言而喻。而且这个Buffer会将页数据缓存一段时间,以便于再次访问页数据时能够快速定位,提高效率。 总之,缓存的引入就是为了减少磁盘的

Minor的Java技术博客 756

mysql 的读取流程 bufferpool redolog undolog mvcc流程原理 lru链表

MySQL的读取流程涉及多个组件,其中最重要的是Buffer Pool,但Redo Log、Undo Log、MVCC(多版本并发控制)也起着重要作用,而LRU链表和空闲链表则与Buffer Pool的内存管理有关。

vmaps的博客 1029

MySQL Buffer Pool

LRU链表分为冷、热数据区域,前63%为热数据区域,后37%为冷数据区域,加载缓存页先放到冷数据区域头部。冷数据区域的缓存页第一次访问超过1秒后,再次访问时才会被移动到热数据区域头部。热数据区域中,只有后3/4的缓存页被访问才会移到头部,前1/4被访问到不会移动。淘汰数据优先淘汰冷数据区域尾部的缓存页。

Mazai-Liu的博客 1489

深入探讨LRU:从原理到工程实践

手写LRU算法,并详解在MySQL的Buffer Pool如何使用LRU、Redis中的近似LRU算法的实现

m0_60505735的博客 358

链表存MySQL_什么是MySQL数据库的缓存池原理?看完或许就懂了

前言面试官:同学,你能说说Mysql 缓存池吗?是CPP啊:啊,这么难吗,容我组织一下语言。(内心OS:这TM还不简单?我能给你扯半小时!)面试官:可以,给你一分钟时间想一想吧。....一分钟后....是CPP啊:我准备好了,你可听好,我要开始表演了。为什么要有缓存池?MySQL 的 innodb 存储引擎是基于磁盘存储的,并且是按照页的方式进行管理的。在数据库系统中,CPU 速度与磁盘速度之间的...

weixin_30173361的博客 188

MySQL缓冲池(buffer pool)

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

qq_36176028的博客 1746

MySQL—缓存

InnoDB会把存储的数据划分为若干个页,以页作为磁盘和内存交互的基本单位,一个页默认大小为16KB,MySQL启动时,InnoDB会为buffer pool申请一篇连续的内存空间,然后按照默认的16KB的大小划分出一个个的页,buffer pool中的页就叫做缓存页。有了 Free 链表后,每当需要从磁盘中加载一个页到 Buffer Pool 中时,就从 Free链表中取一个空闲的缓存页,并且把该缓存页对应的控制块的信息填上,然后把该缓存页对应的控制块从 Free 链表中移除。

qq_51537858的博客 1392

深入理解MySQL_5 BufferPool缓冲池

InnoDB引擎的Buffer Pool机制摘要:Buffer Pool是InnoDB在启动时向操作系统申请的一块连续内存空间,由缓冲页(16KB数据页)和控制块(约800字节的元数据)组成。它通过三种链表管理内存:free链表跟踪空闲缓冲页,flush链表标记已修改的"脏页",LRU链表实现缓存淘汰策略。为解决全表扫描和预读导致的热点数据被挤出问题,InnoDB将LRU链表分为热数据区(63%)和冷数据区(37%),并引入innodb_old_blocks_time参数(默认1秒)确保

田宝宝的博客 606
上一篇: mysql 主从复制 有几种模式
下一篇: jvm 垃圾回收流程
vmaps
博客等级 码龄17年 424粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值