首页 > 系统相关 >innodb的体系结构(内存篇一)

innodb的体系结构(内存篇一)

时间:2023-04-17 10:48:21浏览次数:39  
标签:300M 缓冲 innodb 内存 1G 数据 体系结构

上图innodb存储引擎的架构引用官方手册,从上图来看关于架构的相关功能看起来很复杂,实际上也确实很复杂。为了方便理解我用黄红绿三个框稍微给归纳一下,分成三个部分。

简单的概括一下,当然没有很全面。

 

黄框是关于内存方面的功能;

红框是将数据从内存落实到硬盘的相关功能;

绿框是硬盘表空间的相关功能;

 

缓冲池(bufferpool):

缓冲池主要是通过内存提升数据库运行效率,解决硬盘运行速度较慢的缺点。在内存中分配一块区域给缓冲池,然后将数据库查询到的数据放在划分的内存中。如果下次再读取相同的数据,首先会去内存中找,找到了直接从内存中取走。找不到再去硬盘中读取。

以上是读取的操作,对于修改的操作则会先修改内存上的数据再通过checkpoint刷新回硬盘,这样做主要是减少磁盘的io,提高性能。

而缓冲区的大小将会直接影响Mysql数据库的性能,通过”SHOW VARIABLES LIKE 'innodb_buffer_pool_size’\G;命令可以查看缓冲池大小。

 

缓冲池的管理:

缓冲池通过LRU算法来管理放入内存中的数据,因为内存就算设置的再大也不可能存放所有的数据,既然只能存放一部分那肯定就是要存放最有“价值“的那一部分,而这个价值指的就是”访问频率“。lru会根据访问频率将数据按页的规格从头到尾的存放,访问频率较低的放在尾部,高的放在头部。如果加入缓冲池的数据超过了设置的大小就会从尾部开始将数据释放出缓冲池,并且进行了一定的优化,引入了”midpoint“算法。为什么要引入这个算法,可以想象一下,加入有一个缓冲池1G大小。里面已经存放了1G的数据,前300M是访问频繁的数据,后面700M是频率较低的数据。此时数据库产生了新的300M数据放在缓冲池中,刚才尾部的700M被”挤“出去300M剩400M。而刚才头部的300M被”挤“到中间的位置。这是产生的数据没有超过缓冲池大小的情况如果产生的数据超过了1G呢。比如查询一个比较少用到的表,这个操作可以一个月做不了几次,但是会产生大量的数据比如正好1G。上文说过每个操作产生的数据都会放入内存中,那这个1G不常用的数据是不是正好将300M常用的数据顶出去了。所以引用了”midpoint“算法,产生的新的数据不会存放在头部位置,而是大概3/8的位置,midpoint之前的页是new list,之后的页是old list。如果是 old list 的数据被访问到了,这个页信息就会变成 new list,变成 young page,就会将数据页信息移动到头部。加入了一个参数” innodb_old_blocks_time“表示新加入在midpoint点的数据必须保持多少秒,才能加入到new页。

标签:300M,缓冲,innodb,内存,1G,数据,体系结构
From: https://www.cnblogs.com/xurui96/p/17324998.html

相关文章

  • innodb的体系结构(内存篇二)
    本篇文章介绍同在内存结构中的另一个缓冲池“changebuffer”和“logbuffer”“changebuffer”在innodb的1.0版本之前叫“insertbuffer”主要用于辅助索引(二级索引,非聚簇索引)的dml操作。什么是“聚簇索引”和“辅助索引”,聚簇索引就是选择主键建立的索引如果没有选择主键......
  • 关于vite项目内存溢出无法正常打包的问题
    问题在vite+ts+vue3项目中时pnpmrunbuild构建项目导致无法正常打包解决思路排查问题时发现禁用router插件后能正常打包,禁用掉则会导致溢出。进一步发现是因为.vue文件过多的原因。考虑到可能是nodejs默认的内存不够,增大内存试试。增加到24GB后可以成功打包。项目继续开......
  • InnoDB 记录结构
    我们前边唠叨请求处理过程的时候提到过,MySQL服务器上负责对表中数据的读取和写入工作的部分是存储引擎,而服务器又支持不同类型的存储引擎,比如InnoDB、MyISAM、Memory啥的,不同的存储引擎一般是由不同的人为实现不同的特性而开发的,真实数据在不同存储引擎中存放的格式一般是不同的,甚......
  • 内存相关
    redis中的info指标#redis中key-value使用的内存量used_memory:2709112used_memory_human:2.58M#从操作系统层面redis内存占用量used_memory_rss:5378048used_memory_rss_human:5.13M#内存使用峰值used_memory_peak:6786120used_memory_peak_human:6.47Mused_me......
  • C++中的虚函数表实现机制——对于虚表的内存布局讲解得非常好
    C++中的虚函数表实现机制摘自:https://blog.twofei.com/496/前言大家都应该知道C++的精髓是虚函数吧?虚函数带来的好处就是:可以定义一个基类的指针,其指向一个继承类,当通过基类的指针去调用函数时,可以在运行时决定该调用基类的函数还是继承类的函数.虚函数是实现多态(......
  • 存储引擎-InnoDb介绍
    存储引擎特点:InnoDB:是一种兼顾高可靠性和高性能的通用存储引擎,在mysql5.5之后,InnoDb是默认的mysql存储引擎特点:1.DNL操作遵循ACID模型,支持事务 2.行级锁,提高并发访问性能 3.支持外键(foreignkey)约束,保证数据的完整性和正确性文件:xxx.ibd:xxx代表的是表名,innoDb引擎的每......
  • 内存对齐详解 (C++代码)
    内存对齐详解(C++代码)目录内存对齐详解(C++代码)Test1:结构体对齐Test2:时间开销对比我每天都有读一下面经的习惯,从里面抽一些我不太懂的内容使用dfs的思想去探索,感谢有了GPT4,探索之路变得有趣和高效许多。今天这个Topic如下,是腾讯日常实习面经中的内容编译内存相关:C+......
  • 一文弄懂Python中的内存管理
    1.引言Python是一种解释性语言,这意味着它在运行之前不需要编译。当Python程序运行时,它会动态地为所有变量和对象分配相应的内存。这意味着Python的内存管理是自动处理的,使得开发人员能够专注于编写代码,而不用担心相关内存分配和释放。本文就Python的内存管理进行详述,闲话少说,我们......
  • 存储引擎-mysql体系结构
    mysql体系结构:连接层:最上层是一些客户端和链接服务,主要完成一些连接处理,授权认证,以及相关的安全方案,服务器也会为安全接入的每一个客户端验证它所具有的操作权限服务层:第二层架构主要用于完成大多数的核心服务功能,如sql接口,并完成缓存的查询,sql的分析和优化,部分内置函数的执行......
  • Delphi FDMemTable内存表用法及简单操作函数封装(转)
    在某些场景下当轻量级的应用需要在内存中缓存数量比较多且字段比较多的高频使用数据时。以前我都是采用Ini或直接使用sqlite数据库。JSON也试过基本无法或很难实现需要的功能,因为当涉及某一同类型对象多字段多列时不通过遍历基本无法直接取到或修改数据。这样就导致了效率的低下。......