InnoDB内部结构

news2024/11/19 8:49:45

在mysql数据库中,InnoDB存储引擎是最为常用和强大的存储引擎之一。了解InnoDB的内存结构对于优化数据库的性能,提高系统的稳定性和扩展性至关重要。本文将深入探讨InnoDB的内存结构。

1.Buffer Pool

Buffer Pool: 缓冲池,其作用是用来缓存表数据和索引数据,可以看作是数据库的高速缓存,可以减少磁盘的I/O操作,提高数据库的访问性能。

Buffer Pool 由缓存数据页(Page)和 控制块组成,控制块中存储着对应缓存页所属的表空间,数据页的编号,以及对应缓存页在Buffer Pool中的地址等信息。

Buffer Pool的默认大小是128M,可以通过参数innodb_buffer_pool_size进行配置,一般来说,将buffer pool的大小设置为内存的50% - 80% 是一个比较合理的范围,具体的设置的大小,还是需要根据机器的情况和系统的资源来进行调整。

当进行查询数据的时候,innodb引擎会将磁盘中的数据页,进行缓存到Buffer Pool中。

2.page管理机制

page页可以根据状态分为三类

1.free page: 空闲页,未被使用的page

2.clean page: 被使用的page 数据没有被修改过

3.dirty page :脏页 被使用过,被修改过,并且与磁盘的数据产生了不一致

针对上面的这三种类型,Innodb通过三种链表来进行维护和管理

2.1free list

用于管理 free page,free list是一个链表,用于跟踪Buffer Pool中哪些页面是空闲的,即当前没有被用于缓存数据。当InnoDB需要一个新的页面来缓存数据时,它会从free list中取出一个页面。InnoDB会维护多个free list,通常是为了支持并发操作和提高性能。每个free list可能对应一个特定的内存区域或使用情况。

随着时间的推移,free list的大小会发生变化。当从磁盘读取一个新页面并将其放入Buffer Pool时,一个页面会从free list中移除。当从Buffer Pool中淘汰一个页面(例如,由于LRU(最近最少使用)策略)时,该页面会被添加到free list中。

从磁盘中进行加载页的流程:

1. 从free list 链表中进行获取一个空闲的控制块

2.把该缓存页对应的控制块信息填上

3. 把该缓存页对应的free链表的节点从链表中进行移除(因该缓存页已经被使用)

2.2 flush list

flush list是一个链表,用于管理dirty page,链表按照修改时间进行排序,InnoDB引擎为了提高处理效率,在每次进行修改缓存页,并不会立刻把修改的刷新到磁盘上,而是在未来的某个时间点进行刷新操作,所以用flush list链表存储脏页,凡是被修改过的缓存页对应的控制块都会作为节点添加到flush list链表中。

flush list链表与 free list 链表的结构相似。

2.3 LRU list

用于管理clean page 和dirty page,按照按照页面的访问时间进行排序,最近被访问的页面位于列表的前端,而最久未被访问的页面位于列表的尾端。

2.3.1 普通的LRU算法

普通的LRU算法:最近最少使用,即末尾淘汰法,新的数据从头部加入,释放空间的时候,从末尾淘汰。

1.当访问某个数据页时,如果不在Buffer Pool,就需要将该数据页加载到Buffer Pool中,并将该缓冲页对应的控制块作为节点添加到LRU链表的头部。

2.当访问某个数据页时,如果在Buffer Pool,则直接把该页对应的控制块移动到LRU链表的头部。

3.当需要进行释放空间的时,从最未尾进行淘汰。

普通LRU算法的优缺点

优点:

所有的最近使用的数据都会在表头,可以最大程度上保证热数据能被最快访问到。

缺点:

1. 如果发生全表扫描的时候,会把表中的所有的页加载到buffer pool中,就会将真正的热数据淘汰掉

2.mysql 存在预读机制(线性读:从磁盘加载数据到Buffer Pool中的时候,顺序访问某个区(一个区64个页)的页,超过了56个,会把整个区的数据进行加载到Buffer Pool;随机读: Buffer Pool的存储一个区的13个页,就将这个区的页数据 异步存储到buffer poll中。),很多预读的页也会放到LRU链表的头部,这样也会导致真正的热数据淘汰

2.3.2 改进后的LRU算法

改进后的LRU算法:链表分为两个区域,一个为冷数据区,一个为热数据区。加入数据的时候不再是从头部进行插入,而是从midPoint(中间位)插入,这个midPoint就是冷数据区的头部,如果这个数据很快会被访问的话,就会从冷数据区向热数据区进行移动,如果数据没有被访问,就会逐步向冷数据区尾部移动,等待淘汰。

冷数据区的数据什么时候才会转移到热数据区呢

当一个数据页被加载到内存1000ms后,如果再次被访问,就会将其加入到热数据区的头部,这个时间可以通过参数innodb_old_blocks_time进行设置,默认值是1000,单位是ms.

对于热数据区,当他被访问的时候不是立刻就将其放到热数据区头部,而是会做一个判断其是否处于链表的前1/3,如果是,那就不会移动,如果处于后2/3的区域才会将其移动,因为每一次一定都会消耗CPU资源.

3.change Buffer

InnoDB的Change Buffer是MySQL中InnoDB存储引擎为了提高非唯一索引(通常指二级索引或辅助索引)操作性能而引入的一种机制。Change Buffer的大小可以通过参数innodb_change_buffer_max_size来动态设置,该参数表示Change Buffer最多可以占用Buffer Pool的百分比,默认占25%。

Change Buffer的工作原理:

1. 当InnoDB需要更新一个非唯一索引的数据页,但这个数据页并不在Buffer Pool中时,InnoDB不会直接从磁盘加载这个数据页到Buffer Pool中,而是将这些更改操作(如插入、更新或删除)缓存在Change Buffer中。这样做的目的是减少对磁盘的I/O操作,从而提高数据库的整体性能。

2.当这些被缓存的更改操作对应的数据页被其他读操作加载到Buffer Pool中时,这些更改操作会被合并到对应的数据页上。

3.当系统关闭、后台线程定期合并或Buffer Pool空间不足时,Change Buffer中的更改操作也会被合并到对应的数据页上。

Change Buffer为何只适用于非唯一索引:如果在索引设置唯一性,在进行修改时,InnoDB必须要做唯一性校验,因此必须查询磁盘,做一次IO操作。会直接将记录查询到BufferPool中,然后在缓冲池修改,不会在ChangeBuffer操作。

4.log buffer

log Buffer:日志缓冲区,也称为Redo Log Buffer,主要用于缓存redo log的写入操作。redo log是InnoDB用于保证事务持久性的物理日志,它记录了事务对数据库的更新操作。log Buffer的主要作用是缓存redo log的写入操作,从而减少对磁盘的直接I/O操作,提高数据库的性能。当事务发生时,相关的redo log记录首先被写入到log Buffer中,随后再按照一定的策略刷新到磁盘上的redo log文件中。

logBuffer的刷新策略:log Buffer中的内容并不是实时刷新到磁盘上的redo log文件中的,而是采用了一定的刷新策略。这种策略由相关的系统参数控制,如innodb_flush_log_at_trx_commit和innodb_flush_log_at_timeout等。当log Buffer已满或者达到一定的时间间隔时,其中的redo log记录会被刷新到磁盘上。

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

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

相关文章

为什么https比http更安全

读完本文,希望你能明白: HTTP通信存在什么问题HTTPS如何改进HTTP存在那些问题HTTPS工作原理是什么 一、什么是HTTPS HTTPS是在HTTP上建立SSL加密层,并对传输数据进行加密,是HTTP协议的安全版。现在它被广泛用于万维网上安全敏感…

奇舞周刊第532期:奇舞团生日快乐~

时光荏苒,岁月如歌,转眼间,奇舞团13岁啦🎂🎂🎂《奇舞周刊》也陪伴大家来到了第532期。👏👏 致敬每一位读者和创作者,是你们的热情、陪伴和鼓励,让我们不断前进…

SpringBoot | 大新闻项目源码打包

对于一个完成好的后端项目&#xff0c;如何进行打包发送给其他人&#xff0c;在电脑上进行查看 1.在pom.xml添加&#xff1a; <build><plugins> <!-- 打包插件--><plugin><groupId>org.springframework.boot</groupId><art…

【HTML入门】第二课 - head标签下的常见表情们

目录 1 本节概要 2 head下的常见标签 2.1 网页编码设置 2.2 网页的标题 2.3 样式标签 3 head标签的内容不会显示到网页上 4 查看网页源代码 1 本节概要 上一节&#xff0c;我们说了HTML网页最基本的框架标签&#xff0c;说到标签分为head头部和body身体部分。这一小节呢…

文言文编程语言|老外来了也得先学论语

最近看到一个有意思的开源项目 wenyan&#xff0c;主要功能就是使用文言文来编写代码。 按项目说明 “Wenyan” 是一种遵循中国古典文学的语法和语调的编程语言。 此外&#xff0c;文言的字符集仅包含繁体汉字和「」引号&#xff0c;确保古代中国人能够阅读。 该编程语言的文…

C++:类的成员属性,公有,私有,保护

在C中级别&#xff0c;类的成员属性分为三种访问控制&#xff1a;公有&#xff08;public&#xff09;、私有&#xff08;private&#xff09;和保护&#xff08;protected&#xff09;。它们用于控制类内部数据对类外部的可见性和访问权限。设置访问属性对于封装和信息隐藏至关…

Truffle学习笔记

Truffle学习笔记 安装truffle, 注意: 虽然目前truffle最新版是 5.0.0, 但是经过我实践之后, 返现和v4有很多不同(比如: web3.eth.accounts; 都获取不到账户), 还是那句话: “nodejs模块的版本问题会搞死人的 !” 目前4.1.15之前的版本都不能用了, 只能安装v4.1.15 npm instal…

Beats:使用 Filebeat 从 Python 应用程序中提取日志

本指南演示了如何从 Python 应用程序中提取日志并将其安全地传送到 Elasticsearch Service 部署中。你将设置 Filebeat 来监控具有标准 Elastic Common Schema (ECS) 格式字段的 JSON 结构日志文件&#xff0c;然后你将在 Kibana 中查看日志事件发生的实时可视化。虽然此示例使…

SCI二区TOP|麋鹿群优化算法: 一种新颖的受自然启发的元启发式算法

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;SO Oladejo受到麋鹿群的繁殖过程启发&#xff0c;提出了麋鹿群优化算法&#xff08;Elk herd optimizer, EHO&#xff09;。 2.算法原理 2.1算法思想 EHO灵感来自麋鹿…

Win11右键默认显示更多选项的方法

问题描述 win11系统默认右键菜单显示选项太少&#xff0c;每次需要点一下“显示更多选项”才能得到想要内容。比方说我用notepad打开一个文档&#xff0c;在win11上要先点一下"显示更多选项“&#xff0c;再选择用notepad打开&#xff0c;操作非常反人类。 Win11右键默…

FreeRTOS 任务

FreeRTOS使用多任务完成功能&#xff0c;首先要了解任务的基本知识。 裸机编程中&#xff0c;单任务系统的编程方式&#xff0c;即裸机的编程方式&#xff0c;这种编程方式的框架一般都是在 main()函数 中使用一个大循环&#xff0c;在循环中顺序地调用相应的函数以处理相应的…

【matlab】分类回归——智能优化算法优化径向基神经网络

目录 径向基&#xff08;Radial Basis Function, RBF&#xff09;神经网络 一、基本概念 二、网络结构 三、工作原理 四、学习算法 五、优点与应用 六、与BP神经网络的比较 智能优化算法 常见的智能优化算法 灰狼优化算法&#xff08;Grey Wolf Optimizer, GWO&#…

万界星空科技MES系统中的排版排产功能

在当今高度竞争的市场环境中&#xff0c;企业对于生产管理的效率和质量要求日益提高。作为智能制造的重要组成部分&#xff0c;制造执行系统&#xff08;MES&#xff09;以其强大的功能&#xff0c;在提升企业生产能力方面发挥着不可替代的作用。万界星空科技作为行业领先的智能…

eclipse ide中文件编码的修改,解决中文乱码的问题。

1、先上一张图&#xff1a; 记得之前设置过&#xff0c;但是稍微一变&#xff0c;环境编码又到了ISO-8859-1了&#xff0c;然后就出现了乱码。 2、设置eclipse的编码&#xff1a; Preferences--General -- Content Types -- Text -- Java Properties File -- Default encoding…

昇思25天学习打卡营第18天 | 基于MobileNetv2的垃圾分类

内容介绍&#xff1a; MobileNet网络是由Google团队于2017年提出的专注于移动端、嵌入式或IoT设备的轻量级CNN网络&#xff0c;相比于传统的卷积神经网络&#xff0c;MobileNet网络使用深度可分离卷积&#xff08;Depthwise Separable Convolution&#xff09;的思想在准确率小…

node.js外卖小程序-计算机毕业设计源码81838

摘要 自从计算机发展开始&#xff0c;计算机软硬件相关技术的发展速度越来越快&#xff0c;在信息化高速发展的今天&#xff0c;计算机应用技术似乎已经应用到了各个领域。在餐饮行业&#xff0c;除了外卖以外就是到店里就餐&#xff0c;在店里就餐如果需要等待点餐的话&…

complex复数库学习

此头文件是数值库的一部分。本篇介绍complex的基本用法。 常用的API如下&#xff1a; 运算 real 返回实部 (函数模板) imag 返回虚部 (函数模板) abs(std::complex) 返回复数的模 (函数模板) arg 返回辐角 (函数模板) norm 返回模(范数)的平方 (函数模板) conj 返回复共轭 (函…

开启视频创作新篇章!腾讯发布MimicMotion:单张图像+简单姿势,瞬间“活”化视频。

腾讯和上交发布了一个根据图片生成跳舞视频的项目MimicMotion。效果同时支持面部特征和唇形同步&#xff0c;不止可以搞跳舞视频&#xff0c;也可以做数字人。 MimicMotion方案优化的内容有&#xff1a; 引入基于置信度的姿态引导机制。确保生成的视频在时间上更加连贯流畅。 …

Python爬虫教程第1篇-基础知识

文章目录 什么是爬虫爬虫的工作原理用途搜索引擎爬虫Robots协议HTTP的请求过程URL的含义HTTP常见请求头爬虫常用的技术 什么是爬虫 信息的交互是通过web网页、或者移动端等不同的客户端端形式进行交互&#xff0c;这个过程是一个人与网路正常的交互行为。而爬虫可以用来模拟人…

二维树状数组区域查询

落谷4514 过关代码如下 #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc.h> using namespace std; //#define int long longconst int N 2050; int t1[N][N], t2[N][N], t3[N][N], t4[N][N]; int lowbit(int x) { return x & (-x); } int n, m; void update(…