buffer pool原理总结

news2024/12/23 17:32:16

innodb buffer pool原理总结

文章目录

  • innodb buffer pool原理总结
    • 1. 缓存的重要性
    • 2. innodb buffer pool
      • 2.1 buffer pool的内部组成
      • 2.2 FREE链表
      • 2.3 FLUSH链表
      • 2.4 LRU链表
        • 2.4.1 LRU链表的功能
          • 预读

1. 缓存的重要性

我们都知道,对于innodb存储引擎的表来说,无论是索引数据还是真实数据都是以页的形式存在于磁盘上的。当我们在客户端敲上select * from t1;命令时,innodb就会将t1表所在的数据页加载到内存中,等我们下次在用时,直接在缓存中查找,而不会再次向磁盘中调用数据了,毕竟每调用一次就会浪费 一次磁盘IO。
前面我们说到,数据是以页的形式存在于磁盘上的,那么页是从哪里来的呢?又是怎么分配的?首先一个页面的大小是16kb,且不是零散存储于磁盘中,而是通过表空间将他们联系起来,表空间其实是一个虚拟的框框,归根结底,数据还是存储于磁盘上的。关于页的概述可以参考 《表空间》。

2. innodb buffer pool

2.1 buffer pool的内部组成

在这里插入图片描述
由上图可知,innodb存储引擎在内存中维护了一个缓冲池(buffer pool),主要存储了数据页,索引 页,undo页,自适应哈希索引,change buffer等。
buffer pool 的大小由参数innodb_buffer_pool_size决定 ,默认大概有128M,buffer pool不能设置的太小,最小可以设置为5M,当buffer pool小于5M时,innodb会自动调成5M。

当然,buffer pool里面也是有好多实例的,由innodb_buffer_pool_instance决定 ,每个instance下面又分有多个chunk,每个chunk的大小由innodb_buffer_pool_chunk_size决定,在默认情况下,每个chunk有128M。
在这里插入图片描述
buffer pool 对应一片连续的的内存被划分的页面,页面大小于与innodb表空间能用的页面大小一致,默认是16kb,此处我们称为是缓冲页,每个缓冲页面对应一个控制头,(控制头,你可以理解是缓冲页的属性信息,包括该页面的表空间id,页号,缓冲信息)。每个控制头大概有808字节。所以内存池的实际大小会比innodb_buffer_pool_size大5%左右。说完这些后,再来说碎片,如果控制头和缓冲页分配不均,就会产生一些碎片,如果buffer pool设置的大小刚好,则不会产生碎片了。

上图中我们可以看到每个实例下都有free链表,flush链表和LRU链表。那这些都是做什么的呢?

2.2 FREE链表

在这里插入图片描述
从图中可以看出,free 链表的主要工作是为了将控制块连接起来,更好的管理。其中,free链表里分为start,end,count,分别是定义了链表的头节点,尾节点,以及当前链表的数量。
此外的LRU链表和FLUSH链表的节点和此相似。

2.3 FLUSH链表

在学习表空间章节时,我们也接触过FLUSH链表。当修改过内存中的表数据,就会产生脏页,然后就会将此页面的指针指向到FLUSH链表,表示这个链表的数据页是需要被刷写到磁盘上的。
那么是有脏页产生后立即刷写到磁盘吗?也不是,这个是要先写redo后,再根据刷脏策略而定的。
在这里插入图片描述

2.4 LRU链表

在buffer pool对应的内存是有限的,随着用户不断写数据,将页从磁盘上加载到内存的buffer pool中,再将缓冲页变成脏页,刷写到磁盘,free链表里能用的页越来越少,将没有多少空闲页了,那么这时就要将flush链表中的数据腾出一些给free链表了,那腾出哪一些呢?当然是不经常访问的页了,LRU类似是一个栈,先进先出,随着在内存中的页越来越多,这些使用的页的控制头就会依次加入到LRU链表中,如果一个页很久都没使用了,就会率先将它剔除。

  • 如果该页不在buffer pool中,在把该页从磁盘加载到buffer pool中的缓冲页时,就把该缓冲页对应的控制 块作为节点加载到LRU链表的头部了
  • 如果该页已经加载到buffer pool中了,则直接把该页对应的控制块移动到LRU链表的头部。

2.4.1 LRU链表的功能

预读
  • 预读的含义
    就是说InnoDB认为执行当前的请求时,可能会读到哪些数据页,自动将数据页加载到buffer pool中去。

  • 预读的分类

    • 线性预读
      innodb_read_ahead_threshold如果顺序的访问的某个区的页面超过这个系统变量的值(默认值56) ,就会触发一次异步读取下一个区中全部的页面到buffer pool中的请求。
    • 随机预读
      如果某个区的13个连续的页面都加载到了buffer pool,无论这些页面是不是随机读取的,就会触发随机预读,通过innodb_random_read_ahead变量控制,默认是off。
  • 预读的弊端

    • 假如执行select * from t1;,t1表中一亿行,可能分布在300个页面上,当加载到buffer pool中时可能就会将LRU之前保存的数据剔除掉,还会影响命中率
  • 优化预读

    • 通过innodb_old_blocks_pct将LRU链表分为两段,一段是热数据,一段是冷数据 。此变量默认值是3/8,表示冷数据占用3/8,热数据占用5/8.
      当遇到一次写请求,Innodb将所需要的数据页首先会加载到LRU链表的头部,如果是本来已经存在LRU链表的数据就会将页移动到链表头部。那么这就有个问题了,如果这个页面本来就在LRU链表的5/8处只是没有在LRU链表的头部,那还移动吗?
      innodb规定,如果此页面在LRU链表头部的1/4内处,就不会移动了。

    • 回到上个问题,如果select * from t1,t1表有很多数据,可能分布在多个页面上,加载到buffer pool中时就会将LRU之前保存的数据一并剔除,针对这一点的优化策略如下:

      1. innodb规定,在对某个处于old区域的缓冲页面进行第一次访问时,就在它对应的控制 块中记录下这个访问时间,如果 后续的访问时间与第一次的访问时间在某个时间间隔内,那么该页就不会从冷数据区移动到热数据区了。通过innodb_old_blocks_time控制 。
      2. 如果把innodb_old_blocks_time的值设置为0,那么每次访问一个页面时,就会把该页面放到热数据的头部。
  • 相关参数
    innodb_lru_scan_depth 控制 lru列表中可用页的数量 ,默认是1024

参考:
https://dev.mysql.com/doc/refman/8.0/en

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

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

相关文章

快手用户活跃度分析(未完成)

目标 为期30天的用户数据,但是不是所有的用户都有30天的信息数据,比如用户A第7天注册的,则其前6天没有数据。 预测未来用户活跃度的可能性。 预测7天后的,基于第7天,预测第14天,基于第8天,预测…

2023数模A题——定日镜场的优化问题

A题——定日镜场的优化问题 思路:该题主要考察的几何知识和天文学知识,需要不同角度下的镜面和遮挡情况。 资料获取 问题1: 若将吸收塔建于该圆形定日镜场中心,定日镜尺寸均为 6 m6 m,安装高度均为 4 m,且…

解密Kubernetes(K8s)集群的创建过程和关键步骤

文章目录 1. 准备环境2. 安装Docker3. 安装Kubernetes在Master节点上执行以下步骤:安装kubeadm、kubelet和kubectl初始化Master节点 在工作节点上执行以下步骤:加入集群 4. 设置Kubeconfig5. 安装网络插件6. 验证集群7. 部署应用程序8. 扩展和管理集群9.…

Weblogic反序列化漏洞

文章目录 1、搭建环境2、漏洞特征3、漏洞利用1)获取用户名密码2)后台上传shell 4、检测工具 1、搭建环境 漏洞环境基于vulhub搭建–进入weak_password的docker环境 sudo docker-compose up -d拉取靶场 2、漏洞特征 404特征Weblogic常用端口:7001 3、漏洞利用…

centos7使用docker-compose一键搭建mysql高可用主从集群

docker部署 环境准备 卸载旧版本 yum remove -y docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine 安装依赖 yum install -y yum-utils \…

PCB - 封装焊盘阻焊层的检查

文章目录 PCB - 封装焊盘阻焊层的检查概述检查做出的实际PCB正反面厂家提供的生产稿PCB对应的原始gerber文件查封装拿一个插件电阻为例插件封装焊盘的基本数据END PCB - 封装焊盘阻焊层的检查 概述 打样回来, 看到要焊接的几个插件管脚有阻焊, 无法焊接. 这几个封装是直接从第…

腾讯发布超千亿参数规模的混元大模型;深度学习与音乐分析与生成课程介绍

🦉 AI新闻 🚀 腾讯发布超千亿参数规模的混元大模型 摘要:腾讯在2023腾讯全球数字生态大会上发布混元大模型,该模型拥有超千亿的参数规模和超2万亿 tokens 的预训练语料。混元大模型将支持多轮对话、内容创作、逻辑推理、知识增强…

CleanShot X for mac安装下载,mac系统录屏、截图、标注软件

您是否经常需要截图、录屏或者标注图片?如果是,那么您一定会喜欢CleanShot X for mac,这是一款专为Mac用户设计的强大而简洁的工具。 CleanShot X for mac可以让您轻松地截取任何区域的屏幕,无论是整个屏幕、窗口还是选定的部分。…

Say Goodbye to OOM Crashes

内存管理 --- 在计算机编程中,内存管理是一项关键任务,用于在程序运行时正确分配和释放内存。一个有效的内存管理系统可以帮助程序提高性能,减少内存泄露和访问错误等问题。 内存管理涉及以下几个方面: 1. 内存分配&#xff1a…

MMDetection实验记录踩坑记录

AP值始终为0 在实验MMDetection的DAB-DETR模型进行实验时,AP值始终上不去。 可以看到,在第22个epoch时的AP值仅为0.002 因为在此之前已经运行过YOLOX,Faster-RCNN等模型,所以数据集的设置肯定是没有问题的,而博主也只是修改了DAB…

嵌入式学习笔记(18)代码重定位实战 下篇

adr和ldr伪指令的区别 ldr和adr都是伪指令,区别是ldr是长加载、adr是短加载。 adr指令加载的是运行时地址;ldr指令加载的是链接地址。 (通过反汇编文件可以深入分析adr和ldr的区别) 重定位(代码拷贝) …

行业Demo分享|「园区智慧安防可视化系统」实现园区安防全面保障

在当今社会,园区安全问题备受关注。**为了解决园区的安全隐患并提升安全管理水平,园区智慧安防可视化系统应运而生。**这一系统利用先进的技术手段,将智能监控与安全管理完美地融合在一起,并通过可视化的方式,为园区提…

无swing,高级javaSE毕业之贪吃蛇游戏(含模块构建,多线程监听服务)

JavaSE,无框架实现贪吃蛇 文章目录 JavaSE,无框架实现贪吃蛇1.整体思考2.可能的难点思考2.1 如何表示游戏界面2.2 如何渲染游戏界面2.3 如何让游戏动起来2.4 蛇如何移动 3.流程图制作4.模块划分5.模块完善5.0常量优化5.1监听键盘服务i.输入存储ii.键盘监…

win10 sourcetree打开一闪就退出

参考文档: 解决方案参考文档一: Solved: cant install Sourcetree on Windows 10Solved: when I double-click the installation file or run as administrator,I can see a splash screen and disappear in 10 seconds,then I open thehttps://community.atlassian.com/t5…

GoFrame框架

GoFrame框架 GoFrame简介第一个GoFrame应用使用GoFrame实现一个完整的用户案例GoFrame对象管理GoFrame配置管理-配置对象GoFrame配置管理-文件配置GoFrame日志组件GoFrame错误处理GoFrame数据校验GoFrame Web服务简介GoFrame Web服务-路由规则GoFrame Web服务-路由注册GoFrame…

长胜证券:A股三大指数缩量探底券商股逆势拉升

周四,A股全天低开低走,三大指数均跌超1%,创业板指领跌。截至收盘,上证综指报收3122.35点,跌落1.13%;深证成指报收10321.44点,跌落1.84%;创业板指报收2056.98点,跌落2.11%…

索尼 toio ™应用创意开发征文|一个理想的绘画小助手

引言 toio™机器人是索尼推出的一款创意玩具,它的小巧和可编程性使其成为一个理想的绘画助手。通过编程控制机器人的运动和绘画工具,我们可以为小朋友提供一个有趣的绘画体验。 创意描述 我们可以通过JavaScript编程来控制toio™机器人的运动和绘画工具…

自己设计CPU学习之路——基于Xilinx FPGA应用开发

1. 一个32组位宽为32的寄存器堆 框图 代码 regfile.h ifndef __FEGFILE_HEADER__define __REGFILE_HEADER__define HIGH 1b1define LOW 1b0define ENABLE_ 1b0define DISABLE_ 1b1define DATA_W 32define DataBus 31:0define DATA_D 32de…

谷歌SEO手工外链工具好用吗?

答案是:不建议使用工具做谷歌外链,会被判断为作弊惩罚。 在当今的SEO环境中,外链仍然是一个核心组件,影响着网站的权威性和在搜索引擎结果页面(SERP)上的排名。 但是,随着时间的推移&#xff…

可视化大屏UI模板,随需切换,一秒生效

善用模板能够最大化地提高效率,美化可视化大屏,同时也能腾出更多时间去做深度数据分析挖掘。奥威BI可视化大屏支持UI模板随需切换,一秒生效。用户可以根据自己的喜好和需求,选择不同的UI模板,快速改变可视化大屏的外观…