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

2024-06-06 09:36

本文主要是介绍Innodb Buffer Pool缓存机制(三)Innodb Buffer Pool内部组成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、控制块+缓存页

  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链表,它对了一下优化,详情请见下一章。

这篇关于Innodb Buffer Pool缓存机制(三)Innodb Buffer Pool内部组成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035734

相关文章

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程

Java中自旋锁与CAS机制的深层关系与区别

《Java中自旋锁与CAS机制的深层关系与区别》CAS算法即比较并替换,是一种实现并发编程时常用到的算法,Java并发包中的很多类都使用了CAS算法,:本文主要介绍Java中自旋锁与CAS机制深层... 目录1. 引言2. 比较并交换 (Compare-and-Swap, CAS) 核心原理2.1 CAS

Spring Boot 集成 mybatis核心机制

《SpringBoot集成mybatis核心机制》这篇文章给大家介绍SpringBoot集成mybatis核心机制,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值... 目录Spring Boot浅析1.依赖管理(Starter POMs)2.自动配置(AutoConfigu

Redis的安全机制详细介绍及配置方法

《Redis的安全机制详细介绍及配置方法》本文介绍Redis安全机制的配置方法,包括绑定IP地址、设置密码、保护模式、禁用危险命令、防火墙限制、TLS加密、客户端连接限制、最大内存使用和日志审计等,通... 目录1. 绑定 IP 地址2. 设置密码3. 保护模式4. 禁用危险命令5. 通过防火墙限制访问6.

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

mysql8.0.43使用InnoDB Cluster配置主从复制

《mysql8.0.43使用InnoDBCluster配置主从复制》本文主要介绍了mysql8.0.43使用InnoDBCluster配置主从复制,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录1、配置Hosts解析(所有服务器都要执行)2、安装mysql shell(所有服务器都要执行)3、

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

详解Spring中REQUIRED事务的回滚机制详解

《详解Spring中REQUIRED事务的回滚机制详解》在Spring的事务管理中,REQUIRED是最常用也是默认的事务传播属性,本文就来详细的介绍一下Spring中REQUIRED事务的回滚机制,... 目录1. REQUIRED 的定义2. REQUIRED 下的回滚机制2.1 异常触发回滚2.2 回