Innodb内存结构

缓冲池Buffer Pool:

缓冲池是innodb内存结构缓冲区中的核心部分,在服务启动的时候服务器会向操作系统申请一块大小为128MB的内存空间,所有对数据库中数据的增删查改操作均在缓冲池bufferPool中完成,并且缓冲区中其他组件的描述信息也都存储在缓冲池中

Buffer Pool结构

缓冲池管理的最小单位是页,多个页通过一个chunk块管理,多个chunk块通过一个instance管理,呈现层级结构,如图所示
在这里插入图片描述
内存中对页的组织:
页从磁盘被加载到内存中,也需要对页进行管理,此时不能再使用页中的next_record管理内存页了,因为next_record是磁盘地址并且被加载到内存的页可能是不连续的
在不修改页的前提下innodb引入了控制块的概念用来管理内存页,简单得说就是每一个控制块有唯一对应得内存页,并且所有控制块被一个带头双向链表关联,通过遍历控制块链表就能遍历所有内存页 如图所示
在这里插入图片描述

chunk块作用

chunk 是一块连续的大内存区域,InnoDB 可以更灵活地管理不同大小的内存块,避免内存碎片。而直接管理 page 的地址,可能会导致更多的内存碎片

chunk类似于一个内存池的机制,以固定大块的空间为单位分配与释放内存空间,可以有效的降低空间申请和释放的次数,如果instance直接管理page,那么就需要page大小的堆空间频繁申请与释放,时间成本就上去了,不妨一次申请一个chunk块大小的空间(一般大小为页空间的整数倍),一段时间内就不需要申请释放了,一定程度上提高了性能

通过 chunk 管理内存,减少了对大量 page 的直接操作,简化了整体的内存管理流程。内存管理模块可以专注于管理少量的 chunk,而不是成千上万个 page
缓冲池中对页的申请和释放都是以chunk块为单位的

chunk块初始化

当缓冲区完成初始化后会把每个数据页所占用的内存空间和对应的控制块提前分配到,只不过此时控制块和数据页都是空的(未使用)
chunk块中左半部分为控制块信息,右半部分为页信息
控制块信息从左至右初始化
页信息从右至左初始化
在这里插入图片描述
第一个控制块管理第一个页,第二个控制块管理第二个页,依次类推

页管理

缓冲池中采用三个链表管理不同状态的页,三个链表分别是Free List,LRU List,Flush List
页状态分为空闲页Free,干净页Clean,脏页Dirty
顾名思义,空闲页是还没有被使用的页空间,干净页是已经有真实数据但数据未发生修改的页空间,脏页即已经发生数据修改的页空间

当读取指定页的数据时,会从Free List中取出一个空闲页,将目标页的数据拷贝到所获得的空闲页中,并把该页标记为干净页挂入LRU List,如果之后该页的数据发生了修改操作,会把该页标记为脏页挂入Flush List中,但不一定会从LRU中马上删除
LRU List采用了LRU算法对干净页和脏页进行统一管理,当达到阈值大小时,会率先淘汰掉长时间未使用的页

对于Flush List,服务器会在合适的时机对链表中的页进行统一的刷盘操作,刷盘结束后将对应的页空间归置,放入Free List中
在这里插入图片描述

变更缓冲区Change Buffer:

普通情况下对一个文件中的数据修改分为3步:
1、从磁盘中找到目标位置
2、将文件加载到内存中进行修改
3、将最新数据刷新到磁盘
作为一个数据库,修改操作肯定是比较频繁的,如果每一次修改都进行一次上述操作,那么势必会严重降低性能,因为IO的次数太多了,有效的解决办法就是将修改操作先保存到一个缓冲区中,等达到阈值时再IO,一次性批量修改,大幅度降低IO次数,这就是Change Buffer的作用

触发刷新的时机:

读取对应的数据页
系统空闲时
系统正常关闭
change buffer写满
redo log写满

修改操作存入变更缓冲区是由条件的
必须是针对二级索引数据的修改,否则不会进入变更缓冲区,因此建议为每一张表建立二级索引,并且修改时筛选条件为二级索引行
不能是主键索引的原因:主键是不可重复的,如果同一时刻新增2条主键值都为1的数据,在真正修改的时候就会发生主键冲突

自适应哈希Adaptive Hash:

根据InnoDB内部的监控机制,如果监控到某些查询通过建⽴哈希索引可以提⾼性能,则⾃动对这个⻚创建哈希索引,这个过程称为⾃适应,所以叫⾃适应哈希索引。
如果表完全放在内存中,则哈希索引可以通过直接查找任何元素来加快查询速度,为频繁使⽤的查询条件和对应的数据⻚建⽴映射关系,从⽽提升内存级别的查询效率

InnoDB存储引擎的数据存储于B+树中,B+树通常只有3到5层,但从根节点到叶节点的寻路涉及到
多层⻚⾯内记录的⽐较,即使所有路径上的⻚⾯都在内存中,也⾮常消耗CPU的资源
InnoDB对寻路的开销进⾏了优化,⽐如寻路结束后将cursor缓存起来⽅便下次查询复⽤;尽可能
的避免单词寻路开销,Adaptive hash index(AHI)便是为此⽽设计

日志缓冲区Log Buffer:

MySQL在运行过程中会产生大量需要落盘的日志,产生一条写一条肯定是不合理的,通过日志缓冲区将批量的日志统一落盘减少IO次数提高性能

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

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

相关文章

AI绘画Flux【lora模型】【微缩景观】:惊艳!3D场景融入手机上的微景观!

大家好,我是灵魂画师向阳 今天和大家分享一款基于Flux底模训练的微缩景观模型——FLUX|手机上的微景观。此模型主要将手机作为微型景观的基底,强制将3d情景融入手机并控制在手机屏幕上方范围内。 作者在使用提示词直出和使用该Loar提示词生成的图片进行…

手撕小顶堆

1. 抛砖引玉 给定两个以升序排列的整数数组 nums1 和 nums2 , 以及一个整数 k 。 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。 请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。 分析 大根堆(大顶堆&#x…

多旋翼无人机维修、组装、调试技术详解

多旋翼无人机作为现代航拍、农业植保、物流运输等领域的重要工具,其性能的稳定性和操作的便捷性对于任务的完成至关重要。因此,掌握多旋翼无人机的维修、组装与调试技术,对于无人机操作员及维修人员来说至关重要。本文将详细介绍这三个方面的…

线程池ForkJoinPool实战及其工作原理分析

1. 由一道算法题引发的思考 算法题:如何充分利用多核CPU的性能,快速对一个2千万大小的数组进行排序? 这道算法题可以拆解来看: 1)首先这是一道排序的算法题,而且是需要使用高效的排序算法对2千万大小的数…

从一个文本文件中挑选出符合条件的内容行

某天,张三得到一个需求,将如下格式的文本文件中的文件名开头的内容行提取出来,存入一个新的文本文件。 ok 0 文件名:1_zoukaige.mp3 index:10 文件名:2_dahan.mp3 index:20 文件名:3_kuai.mp3 index:30 文件…

【JavaEE精炼宝库】HTTP | HTTPS 协议详解

文章目录 一、HTTP 简介二、HTTP 协议格式:2.1 抓包工具的使用:2.2 HTTP 请求报文格式:2.3 HTTP 响应报文格式:2.4 HTTP 协议格式总结: 三、HTTP 请求详解:3.1 刨析 URL:3.2 方法(method)&#…

Kerberos自我总结Kerberos自我总结

1、协议原理与漏洞产生 1.1 kerberos Kerberos协议是一种基于票据Ticket的认证方式,它由三个角色组成,分别是客户端Client、服务端Server和秘钥分发中心KDC。 协议中的交互分为六步,为AS_REQ、AS_REP、TGS_REQ、TGS_REP、AP_REQ和AP_REP …

揭露大模型本质,大模型入门必看的12本书!看完我直接跪了

敢不敢用一年时间读完这12本书,模型入门必看的12本书!建议收藏!! 第一本: 《基于GPT-3,ChatGPT,GPT-4等Transformer架构的自然语言处理》 主要内容 了解用于解决复杂语言问题的新技术。将GPT-3与T5、GPT-2和基于BE…

用Python实现时间序列模型实战——Day 28-29: 项目报告与展示

一、学习内容 1.1 项目报告的撰写与优化 项目报告应该从项目背景、数据探索、建模过程、预测结果、模型评估等方面进行全面描述。通过清晰的图表、简明的文字和合理的模型选择来优化报告的表达。 1.2 项目结果的展示与交流 通过展示图表、代码、关键模型的结果,…

Linux系统中的进程调度队列

目录 一、进程调度队列结构 二、活动队列与过期队列 1.queue[140] 2.bitmap[5] 一、进程调度队列结构 Linux系统中,每一个CPU都有一个进程调度队列runqueue,如图所示 二、活动队列与过期队列 运行队列runqueue中有两个指针*active、*expired。*acti…

从小白到大神:C语言预处理与编译环境的完美指南(下)

从小白到大神:C语言预处理与编译环境的完美指南(上)-CSDN博客 👆👆👆👆👆👆上篇链接在这~~👆👆👆👆👆&#x…

角色权限管理实现学习

逻辑: 权限表(Sys_Power):存所需授权才能访问的检验字段 授权表/角色权限表(Sys_RolePower):存角色所能访问的权限字段 角色表(Sys_Role):定义角色(管理员,部门负责人,项目负责人...) 用唯一的权限字段标注所要授权才能访问的…

心理辅导系统设计与Spring Boot技术

5 系统的实现 5.1学生功能模块的实现 学生进入本系统可查看系统信息,系统主界面展示如图5-1所示。 图5-1系统主界面图 5.1.1 学生登录界面 学生在登录时需输入正确的登录用户名和密码,系统会以登录用户名、密码为参数进行登录信息的验证,信…

Keil MDK5学习记录

2024.9.19 1. no browse information available in ‘xxx’的问题 成功解决Keil MDK5中no browse information available in ‘xxx’的问题-CSDN博客https://blog.csdn.net/bean_business/article/details/1091894452. .c文件中显示函数列表 如何在Keil5里.c文件中显示函数列表…

oracle数据库启动

文章目录 背景一、步骤1.登录oracle用户2.启动监听服务3.启动数据库 背景 oracle数据库启动 一、步骤 1.登录oracle用户 代码如下(示例): su - oracle2.启动监听服务 代码如下(示例): lsnrctl start成…

AI音乐创作带给音乐原创人的挑战和机遇

随着人工智能(AI)技术的迅速发展,AI音乐创作在全球音乐产业中逐渐崭露头角。人工智能不仅能生成旋律、和声,甚至可以模仿艺术家风格创作出接近真实人类创作的作品。这一技术的崛起给音乐原创人带来了前所未有的挑战,但…

【PyQt5】QWidget子类所有子类

QWidget子类 [QObject 学习](https://editor.csdn.net/md/?articleId142371795) 2024-09-19更新QWidget子类所有子类 2024-09-17发布子类QAbstractButton类 2024-09-17正在学习中QAbstractslider类QAbstractSpinBox类QFrame类QCalendarwidget类QComboBox类QDialogButtonBox类Q…

【计算机网络 - 基础问题】每日 3 题(十八)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…

uniapp 微信小程序 订阅消息功能实现

该网址 https://api.weixin.qq.com 上线后不可访问,调用该网址操作需在后端( 重要! 重要! 重要!) 1.首先拿到的三个码 //微信公众平台 //https://mp.weixin.qq.com const wxappid "管理-开发管理-A…

QTCreator 调试:unknown debugger type “No engine“

QTCreator 调试:unknown debugger type "No engine" - kaizenly - 博客园 (cnblogs.com) 一开始Debuggers---Auto-detected这里第一row第一个项是标红的,然后没改东西,点完应用Apply以后,就可以调试了...(不…