Buffer Pool运行机制理解

2024-05-31 16:20

本文主要是介绍Buffer Pool运行机制理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Buffer Pool机制理解

一、为什么使用Buffer Pool?

众所周知,磁盘数据是以数据页的形式来去读取的,一个数据页默认大小 16K,也就是说你本意只想读取一行数据,但是它会给你加载一页的数据到buffer pool里面。这样的话就能减少与磁盘的交互次数,从而提升效率。

二、什么是Buffer Pool?

  1. 是一块内存区域,当数据库操作数据的时候,把磁盘上的数据加载到buffer pool,对buffer pool数据进行增删改查,不直接和磁盘打交道。
  2. 默认大小 128M
SHOW VARIABLES LIKE '%innodb_buffer_pool_size%'; -- 查看buffer_pool大小 默认128M
SHOW VARIABLES LIKE '%innodb_old_blocks_pct%'; -- LRU链表冷热区域配置 默认3 7
SHOW VARIABLES LIKE '%innodb_old_blocks_time%'; -- LRU链表冷区域的数据隔多久可以放入到热区域
SHOW VARIABLES LIKE '%innodb_file_size%'; -- 单个logfile的大小 默认48M
SHOW VARIABLES LIKE '%innodb_log_file_in_group%'; -- 配置有几个logfile
SHOW VARIABLES LIKE '%innodb_log_buffer_size%'; -- redo log buffer的大小 默认16M
SHOW VARIABLES LIKE '%innodb_flush_log_at_trx_commit%'; -- redo log buffer 中的内容间隔多久刷新到磁盘, 默认1s

三、Buffer Pool运行机制

当我们读取数据的时候,如果buffer pool中不存在则会从磁盘加载到buffer pool,然后一直读取数据就会一直加载,所以buffer pool就会有爆满的时候。这时候就要采取淘汰策略,buffer pool采取的LRU(最近最少使用)淘汰策略。
在此之前先说的是,使用LRU策略淘汰的时候,就会出现下面的所演示的现象(有数据的控制块是不连续的),这时候再读取数据到buffer pool的时候要填充到哪个空白的区域?–就要用到free链表
在这里插入图片描述

1. free链表

主要管理空白区域,该链表会有一个基节点用于管理链表有多少空白的控制块,还有两个结点,一个连接头结点,一个连接尾结点。当读取数据到buffer pool的时候,会找free链表的头结点对应的控制块进行填充,当进行控制块淘汰的时候,空白的控制块就会连接free链表的尾结点。

2. flush链表

当我们进行update语句的时候,就会对数据进行修改,此时也是对buffer pool的数据进行修改,有数据进行修改又没刷新到磁盘的这页数据我们称为脏页。mysql后台线程会对这些脏页进行刷盘,但是要刷哪些页?此时就得靠flush链表了。
flush链表主要管理上面所说的脏页区域,该链表会有一个基节点用于管理链表有多少脏页的控制块,同样有两个结点,一个连接头结点,一个连接尾结点。当mysql后台线程进行刷盘的时候就会找到flush链表有哪些是脏页来进行刷盘。

3.lru链表

当我们读取一页的数据到buffer pool的时候,这一页的数据就会信息就会被记录到lru链表,再读取一页数据,后一页的数据的信息会插到之前的页之前。当读取的页又被用的话,也会插到链表的头结点,所以lru链表最靠前就是最近被使用的数据。当buffer pool满的时候,就会进行淘汰lru链表尾部的数据。

但是这样的lru链表是存在问题的:比如我们有那么几页是频繁查询的数据页始终位于lru链表的头部部分,此时我们执行一个查询数据量非常大的sql,首页会淘汰lru链表尾部的数据块,还是不够的话就会淘汰头部那些热点数据块。因此就会影响热点数据,所以要对lru链表进行升级。

4.升级版lru链表

在这里插入图片描述
升级版的lru链表会分为热数据区域和冷数据区域,占比为5:3,当我们对数据页进行操作时,会插入冷区域的头部,淘汰也是淘汰冷区域的尾部。那么冷区域的数据什么时候才能进入热区域呢?

首先数据页被访问进入冷区域的时候设为t1,该数据页再次被访问的时候设为t2,t2减去t1大于1s的时候就会被放入热数据区域。这样就能预防类似全表扫描这样的sql,对热数据产生的影响,因为一直替换的是冷区域的数据。

这篇关于Buffer Pool运行机制理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

GO语言zap日志库理解和使用方法示例

《GO语言zap日志库理解和使用方法示例》Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,:本文主要介绍GO语言zap日志库理解和使用方法的相关资... 目录1. zap日志库介绍2.安装zap库3.配置日志记录器3.1 Logger3.2 Sugared

深入理解Redis线程模型的原理及使用

《深入理解Redis线程模型的原理及使用》Redis的线程模型整体还是多线程的,只是后台执行指令的核心线程是单线程的,整个线程模型可以理解为还是以单线程为主,基于这种单线程为主的线程模型,不同客户端的... 目录1 Redis是单线程www.chinasem.cn还是多线程2 Redis如何保证指令原子性2.

深入理解MySQL流模式

《深入理解MySQL流模式》MySQL的Binlog流模式是一种实时读取二进制日志的技术,允许下游系统几乎无延迟地获取数据库变更事件,适用于需要极低延迟复制的场景,感兴趣的可以了解一下... 目录核心概念一句话总结1. 背景知识:什么是 Binlog?2. 传统方式 vs. 流模式传统文件方式 (非流式)流

深入理解Go之==的使用

《深入理解Go之==的使用》本文主要介绍了深入理解Go之==的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录概述类型基本类型复合类型引用类型接口类型使用type定义的类型不可比较性谈谈map总结概述相信==判等操作,大

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

golang 对象池sync.Pool的实现

《golang对象池sync.Pool的实现》:本文主要介绍golang对象池sync.Pool的实现,用于缓存和复用临时对象,以减少内存分配和垃圾回收的压力,下面就来介绍一下,感兴趣的可以了解... 目录sync.Pool的用法原理sync.Pool 的使用示例sync.Pool 的使用场景注意sync.