Innodb内存结构

news2024/9/21 15:01:55

缓冲池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.coloradmin.cn/o/2152632.html

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

相关文章

[Linux]Vi和Vim编辑器

Vi和Vim编辑器 Linux系统会内置vi文本编辑器, 类似于windows中的记事本 Vim具有程序编辑的能力, 可以看作是Vi的增强版本, 可以进行语法检查, 代码补全,代码编译和错误调整等功能 Vi和Vim的模式 快速入门 使用vim开发一个Hello.java程序 通过Xshell连接Linux系统命令行输入…

技术美术百人计划 | 《4.5 DOF景深算法》笔记

1. 景深定义 景深(Depth of Field,DOF),是指在摄影机镜头或其他成像器前沿能够取得清晰图像的成像所测定的被摄物体前后距离范围。镜头光圈、镜头焦距、及焦平面到拍摄物的距离是影响景深的重要因素。在聚焦完成后,焦点…

2024年Q3国际信息系统安全认证联盟(ISC2)内部研讨会要点分享

2024年是CISSP认证成立30周年,这是一项具有里程碑意义的成就,代表了CISSP在网络安全领域的卓越、创新和领导力。博主于今年9月份参加了ISC2(国际信息系统安全认证联盟)组织的2024年第3季度内部网络研讨会,针对会议中的…

【sgCreateCallAPIFunction】自定义小工具:敏捷开发→调用接口方法代码生成工具

<template><div :class"$options.name" class"sgDevTool"><sgHead /><div class"sg-container"><div class"sg-start"><div style"margin-bottom: 10px">调用接口方法定义列表</div…

QT 带箭头的控件QPolygon

由于对当前项目需要绘制一个箭头控件&#xff0c;所以使用了QPainter和QPolygon来进行绘制&#xff0c;原理就是计算填充&#xff0c;下面贴出代码和效果图 这里简单介绍下QPolygon QPolygon是继承自 QVector<QPoint>那么可以很简单的理解为&#xff0c;他就是一个点的…

探索丹摩智算平台的奇妙之旅:我的CogVideoX实践实验与深刻体验

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀CogVideoX &#x1f4d2;1. 初识CogVideoX&#x1f4da;2. 部署与准备&#x1f31e;在丹摩智算平台上创建实例&#x1f338;CogVideoX代码仓库…

Linux基础命令——账户简单管理

一.添加用户 命令&#xff1a;useradd username eg:useradd yy 添加用户名为yy的用户 注意&#xff1a; inux中如果新建用户的时候没有用-d参数指定家目录&#xff0c;那么用户的家目录是什么? 指定的默认/home下面&#xff0c;以username命名 二.修改账户口令/密码 命令&…

漫步者头戴式耳机哪个型号好?热门主流头戴式耳机专业深度评测

一直以来头戴式蓝牙耳机凭借其独特的优势&#xff0c;逐渐成为了音乐爱好者、游戏玩家以及日常通勤者的首选&#xff0c;它们不仅融合了卓越的音质体验、便捷的无线连接&#xff0c;还融入了先进的降噪技术和人性化的佩戴设计&#xff0c;为用户带来了前所未有的听觉盛宴与舒适…

css实现居中的方法

水平居中 1. 行内设置text-align 给父元素设置text-align为center&#xff0c;一般用于实现文字水平居中 2. 给当前元素设置margin&#xff1a;0 auto 原理&#xff1a;块级独占一行&#xff0c;表现为在水平方向上占满整个父容器&#xff0c;当水平方向padding&#xff0c;…

500元以内头戴式耳机哪款好?盘点500元以内百元宝藏品牌机型推荐

作为耳机发烧友&#xff0c;我深知一副优质的头戴式耳机都能为我们带来沉浸式的听觉体验&#xff0c;但然而&#xff0c;面对市场上琳琅满目的耳机品牌和型号&#xff0c;500元以内头戴式耳机哪款好&#xff1f;对于这个问题我将为大家盘点500元以内百元宝藏品牌机型推荐无论你…

【chromedriver编译-绕过selenium机器人检测】

有小伙伴说使用selenium没能绕过机器人检测&#xff0c;盘他。 selenium机器人检测有2种&#xff0c;一是cdp检测&#xff0c;二是webdriver特征检测。cdp检测前面的博客已写过&#xff0c;这里就提下webdriver特征检测。一、selenium简介 Selenium 是一个强大的工具&#xff…

浅析OceanBase数据库的向量化执行引擎

本篇博客是偏数据库系统概念性的内容&#xff0c;不会深入到 OceanBase 中各个算子和表达式的在向量化中的详细设计和实现。 背景 为了提升OceanBase社区版用户解决问题的效率&#xff0c;OceanBase官方不久前推出了《OceanBase 从入门到实践》系列课程。在第七期直播课程后&a…

Linux笔记---简单指令

1. 使用的环境 博主使用的是华为云服务器xshell终端的方式学习的&#xff0c;因为据说这样的方式比较接近以后的工作环境。 其中云服务器安装的是Ubuntu操作系统(以Linux为内核&#xff0c;适合新手学习Linux的一个版本) 这里的云服务器不一定使用华为的&#xff0c;但是我在…

基于Spring JDBC AbstractRoutingDataSource 实现动态数据源

AbstractRoutingDataSource 实现动态数据源 AbstractRoutingDataSource 即抽象的路由数据源&#xff0c;提供了动态数据源切换的机制。你可以通过实现它的 determineCurrentLookupKey() 方法&#xff0c;根据不同的条件返回对应的数据源 key&#xff0c;基于这点可以根据外部输…

OpenRestry(一个Nginx集成工具)的安装与使用

文章目录 一、OpenRestry介绍1、什么是Nginx呢&#xff1f;2、Nginx的反向代理3、Nginx的作用4、什么是OpenRestry&#xff1f; 二、OpenRestry的安装三、OpenRestry中nginx的使用1、Ngnix可以当做web服务器2、Nginx中可以编写Lua脚本 一、OpenRestry介绍 要想了解什么是OpenR…

ChatGPT搭上langchain的知识库RAG应用,效果超预期

最近利用LangchainChatGPT实现了上传文档实现个人知识库应用的能力&#xff0c;效果比想象得要好。文末大家可以体验一下效果~~ 给大家大致介绍下实现方式&#xff0c;参考了Langchain chatchat。 一、LangchainChatGPT 1、概述 LangChain 是一个强大的框架&#xff0c;可以…

数据技术进化史:从数据仓库到数据中台再到数据飞轮的旅程

随着大数据时代的到来&#xff0c;数据已经成为企业的核心资产之一。在过去几十年间&#xff0c;数据技术也随之不断演进&#xff0c;从早期的数据仓库到近年来热门的数据中台&#xff0c;再到正在快速发展的数据飞轮概念&#xff0c;每一步都是技术革新的体现。 一、数据仓库&…

信息安全工程师(10)网络信息安全法律与政策文件

前言 网络信息安全法律与政策文件是保障网络安全、维护网络空间秩序、保护公民和组织合法权益的重要基石。 一、主要法律文件 《中华人民共和国网络安全法》 发布时间&#xff1a;2016年11月7日&#xff0c;由第十二届全国人民代表大会常务委员会第二十四次会议通过。主要内容&…

9。maven必备小技巧

&#xff08;1&#xff09;配置Maven加速时&#xff0c;除了settings之外&#xff0c;还可如下图所示&#xff0c;配置如下&#xff1a; 若想实现Maven加速&#xff0c;最重要的即User settings file。&#xff08;先修改settings.xml&#xff09; &#xff08;2&#xff09;当…

微服务容错及解决

学前必备知识 学之前我们要理解一些概念&#xff0c;之后我们会遇到QPS&#xff0c;并发量&#xff0c;线程等专有名词。 一文搞懂高并发性能指标&#xff1a;QPS、TPS、RT、并发数、吞吐量 - 知乎 (zhihu.com) 雪崩问题 1 是什么 在微服务远程调用的过程中&#xff0c;还…