Mysql原理与调优-Mysql的内存结构

news2024/9/22 7:24:04

1.绪论

前面说过InnoDB每次查询数据或者更新数据,都是先以16kb的大小将数据读取到内存中,然后对内存中的数据页进行操作。为了减少磁盘IO,Innodb的会先单独的申请一块连续的空间,将从磁盘中的数据页缓存到这片内存中。这片内存就是BufferPool。

2.BufferPool原理

2.1 什么是BufferPool

BufferPool是一块连续的内存区域,主要用来缓存已经从磁盘加载的页。Buffer Pool主要由数据页buffer和change buffer、log buffer三部分组成。而数据页buffer主要存储两部分内容,控制块和数据页。数据页其实就是从磁盘中加载出来的数据内容。控制块是存储数据页的一些元信息,比如页所属的表空间号,页号等。其中数据页部分大小可以通过innodb_buffer_pool_size这个参数进行控制,默认大小为16kb。

2.2 如何判断某个内存页是否已经被缓存到BufferPool中

Mysql会建立一个key为的表空间号+页号,value为控制块的一个hash表,每次访问某个数据页的时候,首先会根据表空间号和页号在该hash表中进行访问,判断该页是否已经加入到了BufferPool中。

3.3 Page页的分类

数据页区的Page分为3类:

1.free page: 未被使用的page页。

2.clean page:已经有数据的page页,并且和磁盘数据保持一致。

3.dirty page:当前数据页和磁盘数据不一致。

为了方便管理这些不同类型的数据页,Mysql通过指针,将同一类型的列串联起来,形成了不同的链表,比如全是free page的链表free list,全是dirty page的链表flush链表。当BufferPool已经全部被写满,但是又需要加载新的page到pool中,这个时候需要淘汰部分页面,Mysql采用的是Lru算法进行淘汰,需要维护一个Lru链表。接下来,我们就来看看这些链表的组成。

3.3 BufferPool中的链表

3.3.1 free 链表

free 链表是由free page的控制块通过指针链接成的一个链表。每次需要从磁盘加载数据时,优先从free链表中取出一块free page,并且将free page的信息从free链表中摘掉,表示该块free page已经被使用。

3.3.2 flush链表

当Buffer Pool中的数据页被修改过后,会被标记为脏页,并加入到flush链表中。Mysql会启动一个线程,将数据定期写入到磁盘中。前面讲缓存的时候,提过,这种模式其实就是异步缓存写入。Mysql是如何将内促中的数据刷入到磁盘中的,我们后面将会介绍。

3.3.3 Lru链表

当Buffer Pool中存储已满,但是需要新的空间的来存储新的页,就需要淘汰一部分旧的数据页。Mysql采用Lru机制进行淘汰。

1. 传统Lru机制

Lru就是最少最近使用,会维护一个lru链表,每次有新的数据页被访问,便会将该数据页加入到链表头部。如果该数据页已经在链表中,也会将其挪移到链表头部。这样链表头部的数据便是最近被访问的数据,每次淘汰只需要淘汰链表尾部的数据即可。

2.传统Lru机制的不足

1.如果执行全表扫描,链表头部的热点数据会被的扫描的数据会被淘汰掉。

2.Mysql存在预读机制,会将一些未被使用的page页加载到内存中,这些页也会将热点数据淘汰掉。

Mysql的预读分为随机预读和线性预读。

线性预读:当磁盘某个区的数据超过innodb_read_ahead_threshold(默认56)页被加载到内存中,会将该区的数据全部加到内存中。

随机预读:如果已经缓存某个区的连续页面超过13个,会将该区的数据全部加载到内存中。

3.改进Lru算法

为了解决上述问题,Mysql将Lru链表分成了两个区域,分别是young区,和old区。

1.数据到达时,先加入old区的头部;

2.如果在Lru链表中存活时间超过1s(由innodb_old_blocks_time控制 ),则会加入到链表头部。

3.4 change buffer

3.4.1.什么是change bufffer

当对二级索引进行进行DML操作(增删改)时,会将sql语句存储到change buffer中,而不会立刻去将磁盘数据加载到内存中,进行更改后刷入磁盘。这样会减少磁盘IO。change buffer 默认大小为buffer pool的25%。可以通过innodb_change_buffer_max_size进行设置。

3.4.2 什么时候将数据刷入到磁盘

1.当change buffer的sql被访问页被加载到内存中时,会实现merge操作。

2.后台线程定期merge。

3.当Mysql实例被关闭时。

3.4.3 change buffer的适用场景

change buffer主要用户写多读少的场景,比如日志类系统。

3.5 Log buffer

Log buffer分为undolog buffer和redolog buffer,他们主要用来缓存的undolog日志和redolog日志。接下来我们可以看看一条事务的执行流程。

1.执行事务的时候,首先记录的事务的undo log日志到 undo log buffer中,会定时将buffer中的redo log日志刷入磁盘。记录undo log主要是为了方便回滚,他是逻辑日志(记录的执行sql语句的相反语句)。

2.将数据写入到redo log buffer中。redo log是物理日志,它的主要作用是保证数据不丢失。

3.将需要修改的page页从磁盘中加载到buffer pool中,并标记位脏页。其中会通过刷盘机制,将数据刷入磁盘。

4.commit事务后,会将redo log buffer中的redo 日志通过二阶段提交的方式持久化到磁盘中。

5.提交事务的时候,也会同时提交bin log日志。

3.6 多实例buffer pool

为了增大并发,一般buffer pool大小超过1g时,可以通过innodb_buffer_pool_instances设置多个buffer pool,这个时候每个buffer pool实例大小为innodb_buffer_pool_size/innodb_buffer_pool_instances。

4. buffer pool的优化

4.1 buffer pool的优化评估

可以通过的以下几个参数查看缓存的命中率:

SHOW STATUS LIKE 'innodb_buffer_pool_read%'

得到结果如下:

命中率 = innodb_buffer_pool_read_requests / (innodb_buffer_pool_read_requests+innodb_buffer_pool_reads)* 100

参数1: innodb_buffer_pool_reads:表示InnoDB缓冲池无法满足的请求数。需要从磁盘中读取。
参数2: innodb_buffer_pool_read_requests:表示从内存中读取页的请求数。

如果命中率小于90%,可以考虑增加缓存。

4.2 buffer pool调节

buffer pool的关系如上图所示:

buffer pool:可以通innodb_buffer_pool_size设置大小;

instance:一个buffer pool由多个instance组成,可以通过innodb_buffer_pool_instances设置instance的数量;

chunk:一个instance由多个chunk组成,可以通过innodb_buffer_pool_chunk_size设置chunk的大小

page:一个chunk包含多个page,可以通过innodb_page_size设置page大小,默认为16kb。

4.3 buffer pool中数据页的状态

可以通过如下命令查看:

show global status like '%innodb_buffer_pool_pages%';

解释如下:

pages_data: InnoDB缓冲池中包含数据的页数。 该数字包括脏页面和干净页面。

pages_dirty: 显示在内存中修改但尚未写入数据文件的InnoDB缓冲池数据页的数量(脏页刷新)。

pages_flushed: 表示从InnoDB缓冲池中刷新脏页的请求数。

pages_free: 显示InnoDB缓冲池中的空闲页面

pages_misc: 缓存池中当前已经被用作管理用途或hash index而不能用作为普通数据页的数目

pages_total: 缓存池的页总数目。单位是page。

4.4 log buffer的优化

4.4.1 log buffer的相关参数

1.设置log buffer的大小
show variables like 'innodb_log_buffer_size';
2.设置多少个log buffer文件
show variables like 'innodb_log_files_in_group';

3.redo log file文件大小

show variables like 'innodb_log_file_size';

一般存储redo log日志是采用两个文件循环写入的方式。

1.如果这两个文件大小过小,会导致两个文件频繁切换。如果开启的是一个大事务,所有日志文件都写完了,但是事务还未提交,这样日志也无法切换。

2.但是redo log日志过大,当Mysql宕机后,重启恢复可能耗费时间过长。我们一般要求log file的大小能够承载一小时的日志量。

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

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

相关文章

数字化转型下的客户服务创新:智能、便捷、人性化

当今这个日新月异的数字时代,企业的竞争已不再局限于产品或服务的本身,而是延伸到了客户体验的每一个细微之处。数字化转型作为推动这一变革的重要力量,正深刻改变着客户服务的面貌,使之变得更加智能、便捷且充满人性化。 一、数字…

Xilinx 7系列收发器GTX入门讲解

目录 一、前言 二、芯片间数据传输技术发展 2.1 时钟/数据同步方式 三、 7系列GTX/GTH 3.1 GTXE2 3.2 Quad 3.3 GTXE2_CHANNEL 3.4 参考时钟结构 3.4.1 外部参考时钟 3.5 CPLL 3.6 QPLL 四、收发器GTX/GTH 4.1 发送器TX 4.2 接收器RX 4.3 TX与RX全流程分析 五、…

CeresPCL 岭回归拟合(曲线拟合)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 由于在使用最小二乘插值拟合时,会涉及到矩阵求逆的操作,但是如果这个矩阵接近于奇异时,那么拟合的结果就会与我们期望的结果存在较大差距,因此就有学者提出在最小二乘的误差函数中添加正则项,即: 这里我们也可…

Catf1ag CTF Web(一)

前言 Catf1agCTF 是一个面向所有CTF(Capture The Flag)爱好者的综合训练平台,尤其适合新手学习和提升技能 。该平台由catf1ag团队打造,拥有超过200个原创题目,题目设计注重知识点的掌握,旨在帮助新手掌握C…

Pycharm远程连接服务器调试程序(包含VPN连接)

一、Ubuntu服务器使用指南 1、建立个人账户: sudo adduser yourname 2、个人账户中建立conda环境 1)将anaconda\miniconda安装包上传到服务器home\yourname目录下 2)bash安装miniconda 3)source .bashrc激活 3、MobaXterm连…

Spring Cloud Gateway 请求转发源码分析

一、背景 Spring Cloud Gateway 作为一种微服务网关组件,相信大家都不陌生,一个请求经过Spring Cloud Gateway是如何转发出去的,今天我们就来分析一下这部分的源码。 二、正文 下面这张图大家在学习Spring Cloud Gateway的时候肯定见过&am…

NASA数据集:DC-8 飞机上收集测量数据(冰原和永久冻土融化、雪反照率降低以及海盐气溶胶)

ARCTAS DC-8 Aircraft Merge Data 简介 ARCTAS_Merge_DC8_Aircraft_Data 是在 "从飞机和卫星收集对流层成分的北极研究 "亚轨道活动期间,从 DC-8 飞机上收集测量数据的各种现场仪器中预先生成的合并文件。该产品的数据收集工作已经完成。 北极是了解气…

网络编程-阻塞、非阻塞、多路复用、Selector对于accept、read、write事件监听实现详解

阻塞 理论 阻塞模式下,相关方法(accept、read、write)都会导致线程暂停。 ServerSocketChannel.accept 会在没有连接建立时让线程暂停。SocketChannel.read 会在没有数据可读时让线程暂停。阻塞的表现其实就是线程暂停了,暂停期…

Spring 解决bean的循环依赖

Spring循环依赖-博客园 1. 什么是循环依赖 2. 循环依赖能引发什么问题 循环依赖可能引发以下问题: 初始化顺序不确定:循环依赖导致无法确定哪个对象应该先被创建和初始化,从而造成初始化顺序的混乱。这可能导致错误的结果或意外的行为。死…

YouTube 创作者起诉 Nvidia 和 OpenAI

- **YouTube 创作者 David Millette**:一位 YouTube 创作者 David Millette 起诉了 AI 巨头 Nvidia,指控该公司未经许可使用他的视频来训练 AI 模型。此前不久,Millette 还起诉了 OpenAI,但并未指控这两家公司侵犯版权。 - **指控…

YOLOV8网络结构|搞懂Backbone-C2f

c2f没有改变图像的输入通道数和分辨率 传进去的和传出去的没变 n = 3*d d是模型缩放里面的depth split成两个分支:a和b 经过一个bottleneck就是加一个c 有n个bottleneck 一共是(n+2)个 学习资料:

加密创投周期进化论(下篇):失落的未来

“中心化主义收编”后时代,叙事枯竭怎么破? 作者:Wenser;编辑:郝方舟 出品 | Odaily星球日报(ID:o-daily) 在《加密创投周期进化论(上篇):再造新世…

Win 10录屏也能如此专业?2024年还有3款免费工具,让你大开眼界

无论你是想捕捉游戏中的精彩瞬间,还是打算制作专业的教学视频,或者需要录制在线会议,Win 10都自带了很强的屏幕录制功能。今天我会告诉你怎么用Win 10自带的录屏工具,还会给你推荐三个好用的录屏软件,并且告诉你它们各…

【区块链+金融服务】农业大宗供应链线上融资平台 | FISCO BCOS应用案例

释放数据要素价值,FISCO BCOS 2024 应用案例征集 粮食贸易受季节性影响显著。每年的粮收季节,粮食收储企业会根据下游订单需求,从上游粮食贸易商或粮农手 里大量采购粮食,并分批销售给下游粮食加工企业(面粉厂、饲料厂…

HTML—css

css概述 C S S 是 C a s c a d i n g S t y l e S h e e t s ( 级 联 样 式 表 ) 。 C S S 是 一 种 样 式 表 语 言 , 用 于 为 H T M L 文 档 控 制 外 观 , 定 义 布 局 。 例 如 , C S S 涉 及 字 体 、 颜 色 、…

社区帮扶对象管理系统pf

TOC springboot419社区帮扶对象管理系统pf 第1章 绪论 1.1 课题背景 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。所以各…

谷歌的高级指令有哪些

今天会分享一些组合用法,这样就能节省许多时间可以放在跟进客户上面(本文只介绍谷歌的搜索指令,并无推广) part one 谷歌常用的搜索引擎指令: 1、Inurl,在网址中 2、Intext,在网页内容中 3、…

Python使用BeautifulSoup进行网页爬虫技术详解

目录 一、BeautifulSoup简介 1.1 安装BeautifulSoup 1.2 引入BeautifulSoup 二、基本使用 2.1 实例化BeautifulSoup对象 2.2 解析HTML文档 2.2.1 查找标签 2.2.2 获取标签属性和内容 2.3 异常处理 三、进阶使用 3.1 复杂标签查找 3.1.1 CSS选择器 3.1.2 正则表达式…

【1-4】设计模式概述

目录 一.设计模式产生背景 二.软件设计模式的概念 三.学习设计模式的必要性 四.设计模式分类 一.设计模式产生背景 二.软件设计模式的概念 软件设计模式,又称设计模式,是一套被反复使用、多人知晓的、经过分类编目的、代码设计经验的总结。它描述了…

skynet的消息发送:send和call

skynet是一个轻量级的游戏服务器框架。 skynet的核心是服务,服务之间通过消息来通信,消息的来源主要有: 定时器网络服务之间的调用(skynet.send或skynet.call) skynet.send和skynet.call 假设我们有两个服务A和B,A发了两条消息…