innodb buffer pool

buffer pool是主存中的一个区域,InnoDB 在访问时缓存表和索引数据。缓冲池允许直接从内存访问频繁使用的数据,这加快了处理速度。在专用服务器上,高达80% 的物理内存通常分配给缓冲池。为了提高大容量读取操作的效率,将缓冲池划分为可能包含多行的页。为了提高缓存管理的效率,缓冲池被实现为页链表; 使用最近使用次数最少(LRU)算法的一个变体,很少使用的数据被老化到缓存之外。

buffer pool LRU

innodb buffer pool LRU在一个新页加入的时候会将最近最少使用的页驱逐出去,并将新页加入到链表中间。中点插入策略将链表看作两个子链表

  • 在new sublist的head是最近访问过的
  • 在old sublist的tail是最近最少访问过的

在这里插入图片描述

在该算法中定义最频繁访问的页在new sublist,old sublist则是访问不频繁的页,等待被淘汰

  1. 最初访问的页(用户发起的操作或者预读)将会插入到两个sublist的中点。也即new sublist尾部,old sublist头部

  2. 访问old sublist的页将会使之移动到new sublist的head

    如果由于用户发起的操作需要读取该页,则立即进行第一次访问,并使该页更新。如果由于预读操作而读取了该页,则第一次访问不会立即发生,并且可能在驱逐该页之前根本不会发生。

  3. 当数据库运行时,缓冲池中未被访问的页面会向列表尾部移动,从而“老化”。new sublist中的页面都会随着其他页面的更新而老化。old sublist中的页面也会随着页面在中点插入而老化。最终,未使用的页面到达old sublist的尾部并被驱逐。

默认情况下,查询读取的页面会立即移动到新的子列表中,这意味着它们在缓冲池中停留的时间更长。例如,对于mysqldump操作或不带WHERE子句的SELECT语句执行的表扫描,可能会将大量数据带入缓冲池,并驱逐等量的旧数据,即使新数据不再使用。类似地,由预读后台线程加载且只访问一次的页面被移动到新列表的头部。这些情况可以将经常使用的页面推到旧的子列表中,在那里它们将被删除。

为应对这种情况,innodb在进入new sublist增加了在old sublist的停留时间innodb_old_blocks_time(默认1000ms),也就是在这个时间间隔内,就不会从old移动到new区

预读

在上面的LRU中提到了预读,那么在innodb中预读是如何表现的呢?

  • linear: 当一个区有连续56页(56是默认值,可以通过设置innodb_read_ahead_threshold改变。范围是0-64,因为最大就是64页)都被读取,那么该区所有页将会被异步预读到buffer pool
  • random: 当一个区随机13个页(13是innodb_random_read_ahead的默认值)都在buffer pool中,那么该区所有页将会被异步预读到buffer pool

innodb LRU在原来LRU的基础上重点是尽快驱逐那些较少使用的数据,为此引入了分段式的链表以及从old到new的时间限制

其实这两个手段很大程度上都是在解决预读所引发的问题,前者是由于预读机制的存在,可能会导致大量并没有实际访问过的数据驱逐了少量实际访问的数据;后者则是因为全表扫描之类情况扫描了全表数据,又因为预读的存在,多读了一次会使得被扫描的数据直接到new sublist

这算得是是一种应对这两种情况的好手段,我在想相比于改良版的k-lru究竟孰强孰弱呢?毕竟只要k设置的合理,这两种情况其实都能避免,只是说k-lru多引入了对访问次数的维护

buffer pool内存管理

在buffer pool中内存管理主要是针对空闲页(也就是如何很快地分配空闲页)以及脏页(也就是如何很快地刷新到持久化储存)

对此,采用了free链表、flush链表分别设计用来管理空闲页和脏页,那样就能很快锁定需要的页,而不需要全部扫描

Ref

  1. https://dev.mysql.com/doc/refman/8.0/en/innodb-buffer-pool.html
  2. https://dev.mysql.com/doc/refman/8.0/en/innodb-performance-read_ahead.html
  3. https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_old_blocks_time
  4. https://xiaolincoding.com/mysql/buffer_pool/buffer_pool.html

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

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

相关文章

npm ERR! code ERESOLVEnpm ERR! ERESOLVE unable to resolve dependency tree

拉取项目到本地 执行 npm install 报错 遇到这个问题首先确认的就是版本是不是太高了,降一下版本。或者通过yarn命令替代npm install命令安装,同理,启动也可以采用yarn dev 启动代替npm run dev 下面教大家用一个NVM工具,这个工…

IntellIJ Idea 连接数据库-MySql

前言:可以用mariaDB工具,在本地创建服务器主机和数据库,而后用intellIJ Idea尝试连接 MariaDB创建数据库练习 1.IntellIJ Idea打开界面右侧Database工具,选择MySQL数据库。 2.填写数据库账号密码,地址端口号&#xff…

Kafka:springboot集成kafka收发消息

kafka环境搭建参考Kafka&#xff1a;安装和配置_moreCalm的博客-CSDN博客 1、springboot中引入kafka依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><…

无涯教程-Perl - print函数

描述 此函数将LIST中的表达式的值打印到当前的默认输出文件句柄或FILEHANDLE指定的句柄中。 如果设置,则$\变量将添加到LIST的末尾。 如果LIST为空,则打印$_中的值。 print接受一个值列表,列表中的每个元素都将被解释为一个表达式。 语法 以下是此函数的简单语法- print…

idea+gradle阅读spring5.2.9源码之源码构建报错解决方案

注意 1、先确保gradle版本和spring、jdk版本对应 本文:gradle:5.6.4/spring 5.2.9/jdk1.8&#xff08;gradle和jdk都要先安装好&#xff0c;gradle还要配置好本地资源文件路径&#xff09; 2、原来项目乱了的话&#xff0c;先重新导入下载的源码项目 3、进入源码所在根目录&…

AST入门与实战(三):if节点转switch节点(瑞数5)

原文地址:https://zhuoyue360.com/jsnx/110.html 1. 期望 这是一个瑞数5代解混淆的案例&#xff0c;我们本章节需要做的是把if节点的内容转换成switch-case内容.以此来熟悉AST对JS混淆的对抗. 原始代码: function whileState() {while (1) {aV cA[wU];if (aV < 4) {if (…

Xcode 基座打包

Xcode基座打包-APP更新版本内容无效 问题&#xff1a;解决&#xff1a; 问题&#xff1a; 使用xcode基座打包之后&#xff0c;上传到appstore进行提审发布。 用户在appstore商城进行更新下载&#xff0c;打开更新后的APP发现版本号是最新的&#xff0c;APP里面的其他内容还是上…

Node.js |(二)Node.js API:fs模块 | 尚硅谷2023版Node.js零基础视频教程

学习视频&#xff1a;尚硅谷2023版Node.js零基础视频教程&#xff0c;nodejs新手到高手 文章目录 &#x1f4da;文件写入&#x1f407;writeFile 异步写入&#x1f407;writeFileSync 同步写入&#x1f407;appendFile / appendFileSync 追加写入&#x1f407;createWriteStrea…

2. 获取自己CSDN文章列表并按质量分由小到大排序(文章质量分、博客质量分、博文质量分)(阿里云API认证)

文章目录 写在前面步骤打开CSDN质量分页面粘贴查询文章url按F12打开调试工具&#xff0c;点击Network&#xff0c;点击清空按钮点击查询是调了这个接口https://bizapi.csdn.net/trends/api/v1/get-article-score用postman测试调用这个接口&#xff08;不行&#xff0c;认证不通…

elementui实现当前页全选+所有全选+翻页保持选中状

原文来自&#xff1a;https://blog.csdn.net/sumimg/article/details/121693305?spm1001.2101.3001.6650.1&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-121693305-blog-127570059.235%5Ev38%5Epc_relevant_anti_t3&depth_1-utm…

Linux —— 文件系统

目录 一&#xff0c;背景 二&#xff0c;文件系统 一&#xff0c;磁盘简介 磁盘分为SSD、机械磁盘&#xff1b;机械磁盘&#xff0c;即磁盘高速转动&#xff0c;磁头移动到读写扇区所在磁道&#xff0c;让磁头在目标扇区上划过&#xff0c;即可完成对扇区的读写操作&#xff…

nacos升级开启鉴权后,微服务无法连接的解决方案

版本&#xff1a; 软件版本号备注spring boot2.2.5.RELEASEspring-cloudHoxton.SR3spring-cloud-alibaba2.2.1.RELEASEnacos2.0.1从1.4.2版本进行升级。同时作为注册中心和配置中心 一、升级nacos版本&#xff0c;开启鉴权 1.在application.properties配置文件开启鉴权&…

thinkphp:分组查询(多条相同列的数据只展示一条)

例子&#xff1a;数据库中有trans_num、subinventory_from、transaction_type、creation_date有相同值&#xff0c;在查询该数据库使&#xff0c;只展示这几个值相同的一条 效果&#xff1a; 限制之前 限制之后 代码 限制前&#xff0c;后端代码 public function select_i…

Java之继承

继承 继承为什么使用继承继承是什么继承的语法访问父类成员访问父类成员变量访问父类成员方法 super关键字子类构造方法super和this异同分别的使用方法 继承的方式final关键字 作者简介&#xff1a; zoro-1&#xff0c;目前大一&#xff0c;正在学习Java&#xff0c;数据结构等…

微服务监控技术skywalking的部署与使用(亲测无坑)

微服务监控技术skywalking的部署与使用 1. 前期准备2. skywalking安装部署2.1 Java Agent2.2 apache/skywalking-oap-server2.3 apache/skywalking-ui 3. 项目启动4.效果展示 1. 前期准备 注&#xff1a;本篇文章采用docker部署&#xff0c;采用8.2.0版本&#xff0c;版本一定…

机器学习、深度学习项目开发业务数据场景梳理汇总记录三

本文的主要作用是对历史项目开发过程中接触到的业务数据进行整体的汇总梳理&#xff0c;文章会随着项目的开发推进不断更新。 这里是续文&#xff0c;因为CSDN单篇文章内容太大的话就会崩溃的&#xff0c;别问我怎么知道的&#xff0c;问就是血泪教训&#xff0c;辛辛苦苦写了一…

C语言 ——指针数组与数组指针

目录 一、二维数组 二、指针数组 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;书写方式 &#xff08;3&#xff09;指针数组模拟二维数组 三、数组指针 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;使用数组指针打印一维数组 &#xff08;3&a…

2023牛客暑期多校训练营7

Beautiful Sequence 贪心&#xff0c;二进制&#xff0c;构造 Cyperation 模拟 &#xff0c;数学 We Love Strings 分块&#xff0c;二进制枚举&#xff0c;二进制容斥dp Writing Books 签到 根据相邻两个异或值B&#xff0c;因为前小于等于后&#xff0c;故从高到低遍历B的每一…

AT89C51单片机实现单片机串口互动(中断方式,单片机--单片机,应答)

说一下功能&#xff1a;客户机发送0x01到服务机 2服务单片机应答0xf2到客户机 3客户机接收到0xf2,发送信息153432这6个数字到服务机 4client发送完信息后发送0xaa结束通信 5server接收到0xaa后回复0xaa结束通信&#xff0c;从此老死不相往来 看代码&#xff1a; //发送端…

C语言 ——函数指针变量

1、概念&#xff1a; 数组指针 - 是指针-是指向数组的指针&#xff0c;是存放数组地址的指针 函数指针 - 是指针 是指向函数的指针 - 是存放函数地址的指针!! 如上所示&#xff0c;函数也是具有地址的&#xff0c;而存放函数地址的指针变量成为函数指针变量。 而有如上所示&a…