Innodb Buffer Pool缓存机制(三)Innodb Buffer Pool内部组成

news2024/11/16 15:37:41

一、控制块+缓存页

  Buffer Pool中默认的缓存页大小和在磁盘上默认的页大小是一样的,都是16KB。为了更好的管理这些在Buffer Pool中的缓存页,InnoDB为每一个缓存页都创建了一些所谓的控制信息,这些控制信息包括该页所属的表空间编号、页号、缓存页在Buffer Pool中的地址、链表节点信息、一些锁信息以及LSN信息,当然还有一些别的控制信息。

  每个缓存页对应的控制信息占用的内存大小是相同的,称为控制块。控制块和缓存页是一一对应的,它们都被存放到Buffer Pool 中,其中控制块被存放到Buffer Pool的前边,缓存页被存放到Buffer Pool后边,所以整个Buffer Pool对应的内存空间看起来就是这样的:
在这里插入图片描述

注:每个控制块大约占用缓存页大小的5%,而设置的innodb_buffer_pool_size并不包含这部分控制块占用的内存空间大小,也就是说InnoDB在为Buffer Pool向操作系统申请连续的内存空间时,这片连续的内存空间一般会比innodb_buffer_pool_size的值大5%左右。

二、Free链表管理

MySQL服务在刚启动的时候,需要完成对Buffer Pool的初始化,也就是向操作系统申请Buffer Pool的存储空间,然后它们划分为若干对控制块和缓存页

但此时还没有使用,所以Buffer Pool中还没有真实的页数据,随着程序运行,就会慢慢有磁盘页数据被缓存在Buffer Pool中。

对于InnoDB来说,将磁盘页读取到Buffer Pool中有几个关键问题,即哪些缓存页是空闲,哪些缓存页已经被使用了。

缓存页对应的控制块就起了大作用,可以把所有空闲的缓存页对应的控制块作为一个节点放到一个链表中,这个链表也可以被称作free链表,或者说空闲链表。

刚完成初始化的Buffer Pool中所有的缓存页都是空闲的,所以每一个缓存页对应的控制块都会被加入到free链表中,free链表的效果图就是这样的:

在这里插入图片描述
有了这个free链表之后,每当需要从磁盘中加载一个页到Buffer Pool中时,就从free链表中取一个空闲的缓存页,并且把该缓存页对应的控制块的信息填上(就是该页所在的表空间、页号之类的信息),然后把该缓存页对应的free链表节点从链表中移除,表示该缓存页已经被使用了。

三、缓存页的哈希处理

当访问某个页的数据时,如何知道该页已经在Buffer Pool中了呢

InnoDB根据表空间号 + 页号来定位一个页,所以可以用表空间号 + 页号作为key,缓存页作为value创建一个哈希表,在需要访问某个页的数据时,先从哈希表中根据表空间号 + 页号看看有没有对应的缓存页,如果有,直接使用该缓存页就好,如果没有,那就从free链表中选一个空闲的缓存页,然后把磁盘中对应的页加载到该缓存页的位置。

四、flush链表管理

如果修改了Buffer Pool中某个缓存页的数据,那它就和磁盘上的页不一致了,这样的缓存页也被称为脏页(Dirty Page)

内存的数据修改后,要保证磁盘上的数据也同步进行修改,最简单的做法就是每发生一次修改就立即同步到磁盘上对应的页上,但是频繁的往磁盘中写数据会严重的影响程序的性能。所以每次修改缓存页后,我们并不着急立即把修改同步到磁盘上,而是在未来的某个时间点进行同步。

在同步内存数据到磁盘中时,需要知道Buffer Pool中哪些缓存页的数据发生了变化,所以同样需要一个存储脏页的链表,凡是修改过的缓存页对应的控制块都会作为一个节点加入到一个链表中,因为这个链表节点对应的缓存页都是需要被刷新到磁盘上的,所以也叫flush链表。链表的构造和free链表差不多。
在这里插入图片描述

五、LRU链表管理

Buffer Pool的大小是有限的,free链表总归有用完的时候,这个时候就涉及到缓存页淘汰的问题了,把旧的缓存页移除,然后把新的缓存页放进来。

Buffer Pool的初衷就是为了减少磁盘IO的次数,缓存命中率越高越好

所以,Buffer Pool的淘汰策略使用LRU算法,淘汰最近最少使用的缓存页,留下最近使用比较频繁的缓存页。

InnoDB为了知道哪些缓存页是最近使用的,就需要再创建一个链表,该链表使用LRU算法来淘汰缓存页,所以称为LRU链表,当访问某个页时,它的工作过程如下:

  • 如果该页不在Buffer Pool中,就把该页从磁盘加载到Buffer Pool中的缓存页时,然后把该缓存页对应的控制块作为节点塞到LRU链表的头部;
  • 如果该页已经缓存在Buffer Pool中,则直接把该页对应的控制块移动到LRU链表的头部;

只要我们使用到某个缓存页,就把该缓存页调整到LRU链表的头部,这样LRU链表尾部就是最近最少使用的缓存页。所以当Buffer Pool中的空闲缓存页使用完时,到LRU链表的尾部找些缓存页淘汰就可以了。

这种简单的LRU链表其实是有一些问题,主要与InnoDB自生的一些特性和SQL语句有关。

mysql当然不会用这样的LRU链表,它对了一下优化,详情请见下一章。

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

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

相关文章

自动控制:自治系统与非自治系统的稳定性分析

自动控制:自治系统与非自治系统的稳定性分析 在自动控制领域,理解自治系统和非自治系统的区别对于分析系统稳定性至关重要。自治系统的运动方程只与系统的状态有关,而非自治系统的运动方程则与系统的状态和时间都有关系。本文将探讨非自治系…

SqlServer2016企业版安装

前言 好久没有知识的累积,最近工作上遇到新的SqlServer2016安装,记录一下 参考文章 SQL Server 2016软件安装包和安装教程 - 哔哩哔哩 (bilibili.com) 安装包准备 需要提前准备软件安装包如下 cn_sql_server_2016_enterprise_x64_dvd_8699450&…

3. 使用tcpdump抓取rdma数据包

系列文章 第1章 多机多卡运行nccl-tests 和channel获取第2章 多机多卡nccl-tests 对比分析第3章 使用tcpdump抓取rdma数据包 目录 系列文章一、准备工作1. 源码编译tcpdump2. 安装wireshark 二、Tcpdump抓包三、Wireshark分析 一、准备工作 1. 源码编译tcpdump 使用 tcpdump…

动物收容所

题目链接 动物收容所 题目描述 注意点 若没有可以收养的动物,则返回[-1,-1]收纳所的最大容量为20000编号随着收养动物的增加自增 解答思路 利用队列先进先出的特点将猫和狗分别存进两个队列中,关键是dequeueAny这个方法中如果此时猫和狗的队列中都有…

【算法无用系列】电影推荐——余弦相似度计算用户相似度原理

【算法无用系列】通过余弦相似度计算电影、用户相似度 话不多说,本文通过电影推荐系统中,基于余弦相似度算法计算出用户相似和电影相似原理。希望可以帮助一些代码不懂的同学一些思路。 记录用户电影评分数据 一般情况来说,会根据用户的行为…

安装Ubuntu桌面系统(虚拟机)

VirtualBox创建虚拟机(为安装Ubuntu桌面系统)-CSDN博客 虚拟机的创建方法如上链接。当虚拟机开始引导之后,便正式开始Ubuntu桌面版的安装过程。Ubuntu桌面版界面做得很漂亮,操作起来也方便,很适合作为入门Linux的操作…

探索安全之道 | 企业漏洞管理:从理念到行动

如今,网络安全已经成为了企业管理中不可或缺的一部分,而漏洞管理则是网络安全的重中之重。那么企业应该如何做好漏洞管理呢?不妨从业界标准到企业实践来一探究竟!通过对业界标准的深入了解,企业可以建立起完善的漏洞管…

Java+SVNCloud+Mysql课程设计

文章目录 1、主要内容2、所需准备3、与sql访问的中间类:SqlMessage4、窗口界面5、main方法 1、主要内容 课程设计,主要通过Javas wing创建窗口,jdbc连接云端mysql数据库进行基本操作,支持随机生成数据并用动态展示数据结果。 先…

重生之 SpringBoot3 入门保姆级学习(16、函数式 Web 编程)

重生之 SpringBoot3 入门保姆级学习(16、函数式 Web 编程) 3.4 函数式 Web 3.4 函数式 Web 个人写过 go 类似于 go gin 框架 1、场景 场景: User RESTful - CRUD GET/user/1 获取1号用户GET/users 获取所有用户POST/user 清求体携带JSON,新…

Java注解使用与自定义

一、什么是注解 注解是元数据的一种形式,它提供有关程序的数据,该数据不属于程序本身。注解对其注释的代码操作没有直接影响。换句话说,注解携带元数据,并且会引入一些和元数据相关的操作,但不会影响被注解的代码的逻…

程序员自我修养

目录 一、技术能力二、持续学习三、问题解决能力四、代码质量五、团队合作六、责任心七、时间与任务管理八、适应变化九、客户导向十、安全性意识十一、文档撰写十二、伦理与法律意识十三、健康生活 程序员作为现代技术行业的核心成员,不仅需要掌握扎实的技术技能&…

在 Java 项目中扫描识别图片中的文字(详细教程)

目录 需求: 步骤: 1、maven配置(pom.xml): 2、下载依赖文件: 3、代码: post进行测试: 测试图片: 测试结果: 需求: 上传图片文件进行扫描…

MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅

MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅 文章目录 MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅地图的扭曲搜索餐厅浏览数据查找当前邻居查找附近所有餐厅查找一定距离内的餐厅使用$geoWithin,不排序使用…

Windows 2000 Server:安全配置终极指南

"远古技术,仅供娱乐" 💭 前言:Windows 2000 服务器在当时的市场中占据了很大的比例,主要原因包括操作简单和易于管理,但也经常因为安全性问题受到谴责,Windows 2000 的安全性真的那么差吗&#x…

kube-promethesu调整coredns监控

K8s集群版本是二进制部署的1.20.4,kube-prometheus对应选择的版本是kube-prometheus-0.8.0 Coredns是在安装集群的时候部署的,采用的也是该版本的官方文档,kube-prometheus中也有coredns的监控配置信息,但是在prometheus的监控页…

主流 RTOS 实时操作系统介绍

主流 RTOS 实时操作系统介绍 1 介绍1.1 概述1.2 RTOS 应用领域1.3 知名实时系统VRTXpSOSOS-9embOSAzure RTOS 【ThreadX 】OpenWrt 【路由】Mbed OS 【ARM 公司开发】VxWorks 【KUKA、ABB、etc】LynxOSQNXNucleusTHREADXuC/OS –II/III 【Silicon Labs 收购,更新频率…

Qt CAN总线发送和接收案例

文章目录 设置比特率类设置比特率类实现 发送数据帧类发送数据帧类的实现m_ui 发送帧界面 连接类连接类实现连接类UI设计 主窗口类主窗口类实现主界面UI 整体UIQT案例 设置比特率类 // 文件: BitRateBox.h // 作用: 定义了一个用于选择比特率的组合框类 BitRateBox&#xff0c…

冯喜运:6.6周四汇市行情怎么看?黄金原油日内短线布局操作

【黄金消息面分析】:周三(6月5日)美市盘初,现货黄金震荡走高,目前交投于2342美元/盎司附近。黄金价格周二下跌超过1%,原因是美元在本周晚些时候美国就业数据公布前趋于稳定,该数据可能为美联储的…

敦煌网、ebay、速卖通等平台一直被差评怎么办?

在电商行业里一直都有一句话,有评行走天下,无评寸步难行 而没有review打造爆款的案例是少之甚少,众所周知,review已经成为用户衡量一件商品的标尺,目前我也是看到一个文章上面写到,一个卖家表示自己平时运…

CSRF+XSS组合

环境&#xff1a;dvwa靶场low等级CSRFXSS payload1 将如下代码 1.html 放置攻击者web服务器中&#xff08;dvwa靶场搭建的网站根目录&#xff09; <html> <body onload"javascript:fireForms()"> <script language"JavaScript"> var …