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

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

时间:2023-04-17 10:47:52浏览次数:57  
标签:log buffer 聚簇 索引 innodb 内存 change 体系结构

本篇文章介绍同在内存结构中的另一个缓冲池“change buffer”和“log buffer”

“change buffer”在innodb的1.0版本之前叫“insert buffer”主要用于辅助索引(二级索引,非聚簇索引)的dml操作。

什么是“聚簇索引”和“辅助索引”,聚簇索引就是选择主键建立的索引如果没有选择主键就会选择唯一索引,没有唯一索引就会自动建立一个隐藏的rowid作为聚簇索引。聚簇索引存放的数据一般都是顺序且唯一,并且在叶子节点会存放该索引一整行的数据,读取聚簇索引的数据一般不会产生磁盘的随机读写速度较快。而辅助索引的列一般非唯一且重复操作辅助索引的数据会造成大量的磁盘随机读写影响效率。

综上所述为此引入了“change buffer”的功能来改善这一情况,之所以改名是因为在1.0版本后Insert、Delete、Update。都进行了缓冲。

而change buffer的作用就是,在执行插入操作时先去缓冲池查找看辅助索引的也在不在缓冲池,如果在就直接插入。不在就放到change buffer中,按照设定的时间规律集中的merge操作。因为此时常常会是多个插入操作同时merge,所以会提高辅助索引的插入性能。merge的操作通常在三种情况下会执行;

一:有个专门的后台线程监控系统的资源使用情况在系统比较空闲时merge ;

二:缓冲池的空间不够时;

三:数据库正常关闭时;

四:redo log写满时;

相关的参数:

innodb_change_buffer_max_size 允许将更改缓冲区的最大大小配置为缓冲池总大小的百分比。默认25%最大50%。

 

最后简单的说一下log buffer,日志缓冲区就是存储要写入到redo log(磁盘上的文件)的内存区域。它的内容会定期的刷新到磁盘。如果业务上有大量dml相关的事务,增加此缓存大小可以减少磁盘io。

相关参数如下:

 innodb_flush_log_at_trx_commit 控制日志缓冲区的内容如何写入和刷新到磁盘。该innodb_flush_log_at_timeout 变量控制日志刷新频率。

标签:log,buffer,聚簇,索引,innodb,内存,change,体系结构
From: https://www.cnblogs.com/xurui96/p/17325002.html

相关文章

  • 关于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也试过基本无法或很难实现需要的功能,因为当涉及某一同类型对象多字段多列时不通过遍历基本无法直接取到或修改数据。这样就导致了效率的低下。......
  • c++核心编程—内存分区模型
    一、概述c++在执行时,将内存大致分为4个区域1、代码区:存放函数体的二进制代码,由操作系统进行管理2、全局区:存放全局变量和静态变量以及常量3、栈区:由编译器自动分配释放,存放函数的参数,局部变量等4、堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收内存四区意义:不同区......