MySQL之Server层的内存结构

news2024/11/20 14:40:12

前言

本文已收录在MySQL性能优化+原理+实战专栏,点击此处浏览更多优质内容。

在这里插入图片描述前面的文章我们介绍了InnoDB存储引擎的一些内存、内存+磁盘的结构以及工作原理,今天我们就来看一下关于MySQL Server层的一些内存结构。

目录

  • 一、Binlog Cache
    • 1.1 Binlog Cache工作原理
    • 1.2 Binlog的写入机制
    • 1.3 Binlog相关参数
      • 1.3.1 binlog_cache_size
      • 1.3.2 sync_binlog
    • 1.4 Binlog刷盘策略应用场景
  • 二、Query Cache
  • 三、Key Buffer
    • 3.1 Key Buffer是什么
    • 3.2 Key Buffer相关参数
  • 四、Read Buffer & Read Rnd Buffer
    • 4.1 Read Buffer是什么
    • 4.2 Read Buffer相关参数
    • 4.3 Read Rnd Buffer是什么
    • 4.4 Read Rnd Buffer相关参数
  • 五、Sort Buffer
    • 5.1 Sort Buffer是什么
    • 5.2 Sort Buffer相关参数
    • 5.3 常见的排序算法
      • 5.3.1 全字段排序
      • 5.3.2 归并排序
      • 5.3.3 rowid排序
  • 六、Join Buffer
    • 6.1 Join Buffer是什么
    • 6.2 Join Buffer相关参数

一、Binlog Cache

Binlog(二进制日志)包含描述数据库更改的“事件”,例如表创建操作或表数据的更改。它还包含可能进行更改的语句的事件,除非使用基于Row的日志记录。二进制日志还包含有关每个语句花费多长时间更新数据的信息。二进制日志有两个重要目的:

  • 复制,复制源服务器上的二进制日志提供了要发送到副本的数据更改记录。源将其二进制日志中包含的事件发送到其副本,副本执行这些事件以进行与源相同的数据更改。
  • 某些数据恢复操作需要使用二进制日志。恢复备份后,将重新执行备份后记录的二进制日志中的事件。这些事件使数据库从备份点开始更新

和InnoDB存储引擎的特有日志Redo Log一样,Binlog是MySQL Server层特有的日志,存放着对数据库操作的变更记录。二者的不同点在于,Redo Log是物理日志,而Binlog是逻辑日志,因为是逻辑日志(记录着除SELECT、SHOW之外的SQL语句)的原因,所以单独的Binlog是不具备Crash-safe能力的,整个MySQL体系结构中,Redo Log和Binlog二者相结合才能保证关系型数据库ACID的特性

1.1 Binlog Cache工作原理

1.2 Binlog的写入机制

和Redo Log一样,Binlog自身也有其写入策略。其实,Binlog的写入逻辑比较简单:事务执行过程中,先把日志写到Binlog Cache,事务提交的时候,再把Binlog Cache写到binlog文件中。

一个事务的binlog是不能被拆开的,因此不论这个事务多大,也要确保一次性写入(因为Binlog写入的单位是Events,一个Events必须包含一个完整的事务,所以这也是大事务造成主从延迟的主要原因)。这就涉及到了Binlog Cache的保存问题。

系统给Binlog Cache分配了一片内存,每个线程一个,参数binlog_cache_size用于控制单个线程内Binlog Cache所占内存的大小。如果超过了这个参数规定的大小,就要暂存到磁盘。

事务提交的时候,执行器把Binlog Cache里的完整事务写入到binlog中,并清空Binlog Cache

在这里插入图片描述
可以看到,每个线程有自己Binlog Cache,但是共用同一份binlog文件。

  • 图中的Write,指的就是指把日志写入到文件系统的FS Page Cache,并没有把数据持久化到磁盘,所以速度比较快。
  • 图中的Fsync,才是将数据持久化到磁盘的操作。一般情况下,我们认为Fsync才占磁盘的IOPS

1.3 Binlog相关参数

1.3.1 binlog_cache_size

设置Binlog Cache的大小,默认大小为32MB,单位:B(字节)

mysql> show variables like 'binlog_cache_size%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| binlog_cache_size | 32768 |
+-------------------+-------+
1 row in set (0.00 sec)

1.3.2 sync_binlog

控制binlog文件的刷盘策略,可选的参数为0、1或N。如下图所示

mysql> show variables like '%sync_binlog%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 1     |
+---------------+-------+
1 row in set (0.01 sec)

在这里插入图片描述
策略一: 最佳性能(sync_binlog=0)
处理过程: 表示每次提交事务都只Write,不主动Fsync;

策略二: 强一致(sync_binlog=1)
处理过程: 表示每次提交事务都会执行Write和Fsync;

策略三: 人为折衷控制(sync_binlog=N)
处理过程: 当sync_binlog=N(N>1)的时候,表示每次提交事务都Write,但累积N个事务后才Fsync

1.4 Binlog刷盘策略应用场景

因此,在出现IO瓶颈的场景里,将sync_binlog设置成一个比较大的值,可以提升性能。在实际的业务场景中,考虑到丢失日志量的可控性,一般不建议将这个参数设成0,比较常见的是将其设置为100~1000中的某个数值。

但是,将sync_binlog设置为N,对应的风险是:如果主机发生异常重启,会丢失最近N个事务的binlog日志。

经常听到:MySQL的双“1”设置。其实双“1”就代表:innodb_flush_log_at_trx_commit=1 && sync_binlog=1,因为在这种组合配置下,MySQL的数据是最有保障的。

二、Query Cache

还记得丁奇大佬的这张图吗?本小节要介绍的Query Cache就在这张图中,已经用红框标注出来了,中文名:查询缓存。

在这里插入图片描述
MySQL拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以key-value对的形式,被直接缓存在内存中。key是查询的语句,value是查询的结果。如果你的查询能够直接在这个缓存中找到key,那么这个value就会被直接返回给客户端。

如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。你可以看到,如果查询命中缓存,MySQL不需要执行后面的复杂操作,就可以直接返回结果,这个效率会很高。

已经被MySQL官方放弃的功能就不介绍了,感兴趣的可以查阅相关资料。

三、Key Buffer

3.1 Key Buffer是什么

Key Buffer是缓冲MyISAM表的索引块的,注意:只缓存MyISAM存储引擎的表索引块,即该参数只对MyISAM表生效。同时,这个内存区域是所有线程共享的。

3.2 Key Buffer相关参数

mysql> SHOW VARIABLES LIKE '%key_buffer%';
+-----------------+---------+
| Variable_name   | Value   |
+-----------------+---------+
| key_buffer_size | 8388608 |
+-----------------+---------+
1 row in set (0.01 sec)

是用于定义MyISAM表索引块的缓冲区的大小,单位:B字节。一般情况下,此参数设置为8~32MB即可,因为MySQL的默认存储引擎已经从原来的MyISAM转变为InnoDB了,所以,该参数也无需过多关注

四、Read Buffer & Read Rnd Buffer

4.1 Read Buffer是什么

每个对MyISAM表执行顺序扫描的线程为其扫描的每个表分配的缓冲区。也用于所有存储引擎的上下文:

  • 用于在临时文件(不是临时表)中缓存索引,当为ORDER BY;
  • 用于批量插入分区;
  • 用于缓存嵌套查询的结果;
  • 也以另一种特定于存储引擎的方式使用:确定MEMORY表的内存块大小。

4.2 Read Buffer相关参数

mysql> SHOW VARIABLES LIKE '%read_buffer%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| read_buffer_size | 131072 |
+------------------+--------+
1 row in set (0.00 sec)

如果您执行多次顺序扫描,您可能希望增加此值,默认为131072。此变量的值应为4KB的倍数。如果将其设置为不是4KB倍数的值,则其值将向下舍入到最接近的4KB倍数。

4.3 Read Rnd Buffer是什么

用于从MyISAM表中读取、任何存储引擎用于Multi-Range Read(MRR)优化的缓冲区。在MyISAM键排序操作后按排序顺序从表中读取行时,通过此缓冲区读取行以避免磁盘寻道。这是为每个客户端分配的缓冲区,不是全局变量。

4.4 Read Rnd Buffer相关参数

mysql> SHOW VARIABLES LIKE '%read_rnd_buffer%';
+----------------------+--------+
| Variable_name        | Value  |
+----------------------+--------+
| read_rnd_buffer_size | 262144 |
+----------------------+--------+
1 row in set (0.01 sec)

定义Read Rnd Buffer缓冲区大小的参数,将变量设置为较大的值可以大大提高ORDER BY 性能

五、Sort Buffer

5.1 Sort Buffer是什么

MySQL会给每个线程分配一块内存用于排序,即SQL语句中的ORDER BY,这块内存区域就称之为Sort Buffer。

5.2 Sort Buffer相关参数

mysql> SHOW VARIABLES LIKE 'sort_buffer_size';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| sort_buffer_size | 262144 |
+------------------+--------+
1 row in set (0.00 sec)

定义Sort Buffer缓冲区大小的参数。

5.3 常见的排序算法

5.3.1 全字段排序

SELECT列表中的全部字段都参与排序的排序方式叫做全字段排序。

5.3.2 归并排序

如果要排序的数据量小于sort_buffer_size,排序就在内存中完成。但如果排序数据量太大,内存放不下,则不得不利用磁盘临时文件辅助排序。

OPTIMIZER_TRACE的结果可以从number_of_tmp_files中看到是否使用了临时文件。(内存放不下时,就需要使用外部排序,外部排序一般使用归并排序算法。数字表示,MySQL将需要排序的数据分成12份,每一份单独排序后存在这些临时文件中。然后把这12个有序文件再合并成一个有序的大文件。0表示排序可以直接在内存中完成,sort_buffer_size 越小,需要分成的份数越多,number_of_tmp_files的值就越大)

5.3.3 rowid排序

MySQL认为排序的单行长度太大,采用另外一种算法法,max_length_for_sort_data,是MySQL中专门控制用于排序的行数据的长度的一个参数。它的意思是,如果单行的长度超过这个值,MySQL就认为单行太大,要换一个算法。(排序的列只包含order by后面的字段和id)

六、Join Buffer

6.1 Join Buffer是什么

之前表联结的章节提到了笛卡尔积(两张表做联结查询的时候,第一个表有M行数据,第二个表有N行数据,第二张表的每行数据要与第一张表的每行数据一一匹配,得到的结果集行数为M×N)的概念。MySQL针对笛卡尔积的联结查询,做了优化,这里我们称M表为驱动表,N表为被驱动表(驱动表和被驱动表不在本章讨论范围,后续的文章会单独讲解,大家先知道这个概念就好),MySQL提出了一个Join Buffer的概念,Join Buffer就是执行连接连接查询前申请的一块固定大小的内存,先把若干条驱动表结果集中的记录装在这个Join Buffer中,然后开始扫描被驱动表,每一条被驱动表的记录一次性和Join Buffer中的多条驱动表记录做匹配,因为匹配的过程都是在内存中完成的,所以这样可以显著减少被驱动表的I/O代价。

6.2 Join Buffer相关参数

mysql> SHOW VARIABLES LIKE '%join_buffer%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| join_buffer_size | 262144 |
+------------------+--------+
1 row in set (0.00 sec)

用于普通索引扫描、范围索引扫描和不使用索引并因此执行全表扫描的连接的缓冲区的最小大小(单位:B字节),默认大小为262144字节(也就是256KB),最小可以设置为128字节。在这里插入图片描述

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

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

相关文章

jvm之远程调试

写在前面 工作中,有时会出现测试环境有问题,本地却正常的情况,此时我们就可以通过JVM提供的远程调用的功能,实现在本地debug调试测试环境代码。 1:例子1直接运行class 首先我们来定义类: package com.f…

Blender 形变类修改器:曲线

目录 形变类修改器1. 测试一:减少环切数量1.1 调整物体原点1.2 让两个物体原点重合1.3 添加曲线修改器1.4 融并边 2. 测试二:曲线的方向2.1 查看曲线的方向(曲线法向显示)2.2 在3D空间调整曲线 3. 测试三:空间位置的影…

【Minecraft开服教学】使用 MCSM 面板一键搭建我的世界服务器 并使用内网穿透公网远程联机

文章目录 前言1.Mcsmanager安装2.创建Minecraft服务器3.本地测试联机4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射内网端口 5.远程联机测试6. 配置固定远程联机端口地址6.1 保留一个固定TCP地址6.2 配置固定TCP地址 7. 使用固定公网地址远程联机 转载自远程穿透文章&…

C语言中链表经典面试题目

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C 🔥座右铭:“不要等到什么都没有了,才下…

MySQL之Change Buffer详解

前言 本文已收录在MySQL性能优化原理实战专栏,点击此处浏览更多优质内容。 上一篇文章一文带你了解MySQL数据库InnoDB_Buffer_Pool(点击跳转)我们学习了InnoDB Buffer Pool的工作原理,其作用是减少MySQL读取数据时直接与磁盘打交道…

百趣代谢组学党参远志散对记忆障碍大鼠学习能力和肠道菌群的影响

文章标题:Effects of Dangshen Yuanzhi Powder on learning ability and gut microflora in rats with memory disorde 发表期刊:Journal of Ethnopharmacology 影响因子:5.195 作者单位:山西中医药大学 百趣提供服务&#xf…

什么是元宇宙数字展厅?元宇宙前景如何 ?

元宇宙是一个近年来备受关注的概念,它被认为是未来数字世界的新形态。元宇宙是一个虚拟的、数字化的世界,它可以模拟现实世界的各种物理、社会和经济系统,同时也可以融合人工智能、虚拟现实等前沿技术,为用户提供更加丰富、多样化…

钴基双金属氧化物储能材料的高效制备和电化学应用

一、引言 钴金属氧化物作为一类典型的储能材料,既可以用于锂离子电池负极材料,又可以用于超级电容器电极材料,因而备受关注 。在作为锂离子电池负极材料时,具有较高的理论比容量,但充放电体积变化较大、材料导电性较差…

十、MyBatis的缓存

文章目录 十、MyBatis的缓存10.1 MyBatis的一级缓存场景1:判断同一个sqlSession是否查询1级缓存,答案:会查询1级缓存场景2:判断不同sqlSession是否查询1级缓存,答案:不会查询1级缓存场景3:判断相…

企业服务管理(ESM)工具

什么是企业服务管理 企业服务管理 (ESM) 是 IT 服务管理(ITSM)原则的延伸,旨在为人力资源 (HR)、法律、设施、营销和财务等业务团队提供更好的服务。ITSM 是 IT 团队管理向客户提供端到端 IT 服务的方式。ESM 的一个例子是建立一个可供整个组织所有团队使用的服务台…

LED显示屏周边设备

LED显示屏市场也呈多元化发展,异型屏、灯条屏、透明屏、小间距等应用新产品的出现无疑不是一种技术创新。以上创新技术的应用,对LED显示屏周边设备生产企业也提出了更高要求。因此,周边设备对推动整个LED显示屏的产业发展起着举足轻重、不可或…

【Linux-进程通信1】管道

🌈进程间通信介绍 🍄进程间通信目的 在操作系统中,每个进程都是独立运行的,它们有自己的地址空间和资源,它们不能直接访问其他进程的资源。然而,在现代计算机系统中,很少有一个进程能够独立完成…

yolov5读取单通道图像会怎样?

通过上图打印可知输入是固定3通道,那么意味着在读取图像中会对图像进行处理。 opencv在默认情况下会读取3个通道的图像,如果是灰度图会将图层复制三次(BGR缺省,BGR),因此读出来的图片是三通道。

xcode打包导出ipa

转载:xcode打包导出ipa 众所周知,在开发苹果应用时需要使用签名(证书)才能进行打包安装苹果IPA,作为刚接触ios开发的同学,只是学习ios app开发内测,并没有上架appstore需求,对于苹果…

【Mybatis】Mybatis之xml开发—用户角色权限关联案例

目录 要求:使用xml开发完成需求查询。 数据库 需求 要求:使用xml开发完成需求查询。 数据库 -- 用户表 create table sys_user(user_id int primary key auto_increment comment 用户ID,user_name varchar(50) comment 用户名,password varchar(32)…

软件测试——性能指标

登录功能示例: 并发用户数500; 响应时间2S; TPS到500; CPU不得超过75%; 性能指标有哪些? 响应时间 并发用户数 TPS CPU 内存 磁盘吞吐量 网络吞吐量 移动端FPS 移动端耗电量 APP启动时间 性能…

windows11 安装多个mysql8

安装一个mysql请参考:windows系统安装mysql8 解压缩版安装顺序_csdn_aspnet的博客-CSDN博客 下载mysql:MySQL :: Download MySQL Community Server 下载后解压到你指定的目录,我下载的非最新版,如图: 在文件夹下面建一…

【SpringMVC】| 控制器异常处理机制及实现流程

MVC目录 一. 🦁 前言二. 🦁 控制器异常处理Ⅰ. 单个控制器异常处理Ⅱ. 全局异常处理Ⅲ. 自定义异常处理 三. 🦁 最后 一. 🦁 前言 咱们来探索一下控制器异常处理流程,以及如何来实现它。 二. 🦁 控制器异…

烈日炎炎的夏天骑行,怎么预防中暑及中暑后怎么处理?

随着天气的逐渐炎热,夏季骑行逐渐成为了人们喜爱的一项运动。但是,在享受骑行乐趣的同时,我们也要时刻关注身体健康,预防中暑等意外情况的发生。下面,本文将从多个角度为大家讲解夏季骑行中暑的预防和处理方法。 一、选…

音频环回实验

音频环回实验 一、WM8978简介 WM8978是一个低功耗、高质量的立体声多媒体数字信号编译码器,它结合了一个高质量的立体声音DAC和ADC,带有灵活的音频线输入、麦克风输入和音频输出处理 WM8978内部有58个寄存器。每一个寄存器的地址位为7位,数…