mysql 内存架构

news/2024/4/26 23:47:12/文章来源:https://blog.csdn.net/jnrjian/article/details/129204260

1. 背景

从 innodb 的整体架构中可以知道 innodb 的内存架构中分为 buffer pool 缓存区, change pool 修改缓冲区, adaptive hash index 自适应哈希索引, 和 log buffer 日志缓冲区.

2. buffer pool

buffer pool 是用于缓冲磁盘页的数据,mysql 的80%的内存会分配给 buffer pool 来使用。

当进行数据查询的时候,如果数据页在buffer pool 中存在的话,buffer pool 则直接返回,如果不存在则会去从磁盘读取,读取后再加载到磁盘中。

当有更新操作时,更新 buffer pool 中的数据,并且记录 redo log,到了 checkpoint 点之后把内存中的脏页(内存和磁盘数据不一致的页)刷到磁盘上。

2.1. buffer pool 的数据结构

buffer pool 的内存结构中,分为3种缓存页 和 3种链表,缓存页分为 空闲页 free page,干净页 clean page,脏页 dirty page。链表分为 free list 当前没有被分配的内存页(即 free page 组成的链表),LRU list 读取到数据的内存页(即干净页和脏页组成的链表),flush list 脏页链表(即脏页组成的链表),这里需要注意在 flush list 中的页也存在与 LRU list 中。

2.2. free list

free list 定义是当前没有被使用的内存页,也就是空闲的内存页,当执行查询操作时,如果页已经在 buffer pool 中了,则查询到直接返回,如果没有在 buffer pool,并且 free list 不为空,则会从磁盘中查询对应的数据,放入 free list 的某一页中,并且把这页从 free list 中移除,放入 LRU 队列中。

2.3. LRU list

LRU list 顾名思义是使用了 LRU 算法,当内存满的时候淘汰最久没有被使用的数据以释放内存空间,来缓存最近使用的数据,innoDB 在原有的 LRU 算法上做了优化,把内存区域又分为了 new 和 old 2个部分,默认配置是 37,意味着 37% 的区域是 old,63% 的区域是 new。

ref:https://dev.mysql.com/doc/refman/8.0/en/innodb-buffer-pool.html

当有新的数据从磁盘查询到内存时,会写入到 old sub list 的头部,当此数据再次被查询的时候,即在 old sublist 中命中之后,会放入 new sublist 的头部。

这样做的目的是为了避免缓存中的热点数据被污染,以提高缓存的命中率,比如有一个sql select * from table,没有设置过滤条件,那大量的数据都会被加载到缓存中,但是这种sql可能很长时间只跑一次,在未来的一段时间内都不会再次查询,如果不拆分 old 和 new,会导致缓存的污染。

2.4. flush list

flush list 中保存的数据表示当前内存中的脏页的数量,即 check point 刷盘的时候需要刷的脏页。

需要注意的是 flush list 中的数据在 LRU 中也会保存,所以当 LRU 中的缓存被淘汰,也会触发 flush list 中的脏页刷盘。

3. change buffer(double write都是mysql 专用的 O:IMU)LRU list(复制脏页进buffer pool)?

上面提到的 buffer pool 主要是用于提升 mysql 查询性能的,mysql 写的性能提升提升主要依赖 change buffer,以前 change buffer 称为 insert buffer,因为以前只做了 insert 操作的性能优化,之后版本更新之后,也能对于修改和删除做缓存处理,所以改名为 change buffer。

3.1. change buffer 解决的问题

我们假设,现在有一张表,其二级索引数据没有 load 到内存的 buffer pool 中,我们对表进行更新操作,那这个时候 innodb 会从磁盘中 load 数据出来到内存中,这是第一次随机 IO 读取,然后在内存进行 update 操作,更新的字段如果涉及二级索引的更新,需要再次读取二级索引的数据到内存中,进行更新,这是第二次随机读取的操作。那 change buffer 就是为了减少第二次随机 IO 读取,以提高更新的效率。

change buffer 的思路是,假设有很多次的更新,但是没有查询,二级索引的更新是可以批处理的,一直等到下一次使用二级索引查询的时候,把磁盘上的二级索引查询出来,和 change buffer 中的索引修改的增量记录做 merge 之后,在使用,那磁盘的查询操作就会从多次变成一次了。

3.2. merge 是不是等于刷盘?

merge 是指把 change buffer 中的增量变更在下一次查询的时候,合并到 buffer pool 中,从而这个 buffer pool 也变成了脏页。刷盘是指的是 buffer pool 中的脏页写到磁盘的过程,这是两个事情。

3.3. 宕机会不会丢失?

不会丢失,因为事务提交的时候,会写 redo log,redo log 中会包含 change buffer 的内容,如果出现宕机,机器重启之后会基于 redo log 做重放,可以恢复 change buffer。

3.4. 查看当前的change buffer

Ibuf: size 1, free list len 12, seg size 14, 1118 merges
merged operations:insert 1, delete mark 1117, delete 0

4. log buffer

log buffer 的作用是缓存 redo log 的写入操作,考虑到一个大事务,在事务期间可能会有很多次数据库操作,不需要在事务中的每一次操作都写入 redo log,可以缓存一定量的 redo log,在合适的时间进行写盘。

合适的时间取决于 mysql 的配置,0 1 2,默认是 1,1是可以保证 ACID 的,0 和 2 都有可能在极端情况下产生数据丢失。具体 0 1 2 的配置可见:https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit

5. adaptive index

adaptive index 自适应哈希索引,目的是为了提升索引的检索效率,B+ 树的检索时间复杂度是 O(logn),生产上 B+ 树的深度一般是 3-4,而 hash 索引的时间复杂度是 O(1)。

mysql 会默认开启自适应哈希索引,基于mysql 的规则,如果是符合自适应 hash 索引要求的,会在 B+ 树的基础上,建立自适应哈希索引。mysql 建立哈希索引必须是对于这个页的访问模式是一样的并且此处超过一定次数,查询条件必须是等值条件查询,比如 select * from table where a = ? 或者是联合索引 where a=? and b=?。

5.1. adaptive index 锁的问题

因为自适应索引是针对于 B+ 树的索引进行优化,涉及到索引的并发问题,所以 mysql 更新自适应索引时需要获得锁,在 5.7 之前只有一把锁,有性能问题,在之后的更新中加入了分片的概念,默认分片是8个分片,也就是8个锁,提高了并行处理的能力。

5.2. 查看当前 mysql adaptive index

可以通过 show engine innodb status 语句来查看是否开启了自适应哈希索引。

可以看到下面的内容,mysql 默认分片是8个分片,所以看到有8块自适应哈希索引。

以及看到通过自适应哈希索引的查询效率是 0.09,而不通过自适应哈希索引的,即通过 B+ 树查询的效率是 0.15.

INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
merged operations:insert 0, delete mark 0, delete 0
discarded operations:insert 0, delete mark 0, delete 0
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 1 buffer(s)
Hash table size 34679, node heap has 3 buffer(s)
0.09 hash searches/s, 0.15 non-hash searches/s

 

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GroupDocs.Merger for Java

GroupDocs.Merger for Java GroupDocs.Merger for Java是一个文档操作API,可帮助您合并、拆分、交换或删除文档页面。API通过启用或禁用密码提供保护,并允许开发人员加入PDF、Microsoft Word、Excel和Powerpoint文档。 支持的文件格式 Microsoft Office格…

内存管理框架---Slab(二)

站在Arnold Lu南京大佬的肩膀,俯瞰内存管理之slab 文章目录slab层的由来slab/slub/slobslab层的设计思想slab相关数据结构创建slab描述符分配slab对象释放slab对象销毁缓存在内核栈上的静态分配高端内存的映射永久映射临时映射每个CPU的分配新的每个CPU接口编译时的…

为什么需要这个岗位,软件测试是干什么

目录 一、软件测试概念 二、软件测试目的 三、软件测试基本原则 四、软件测试主要工作内容 五、软件测试方法 六、测试工程师的职责 七、为什么要软件测试这个岗位 一、软件测试概念 软件测试:为了发现软件错误和缺陷(统称bug)而执行…

浅谈liunx init.d 和 rc.local 两种起动方式

浅谈liunx init.d 和 rc.local 两种起动方式 以rabbitmq 举例 (一).init.d 方式 开机自动重启设置 1.在/etc/init.d 目录下新建一个 rabbitmq [rootlocalhost init.d]# vi rabbitmq具体脚本如下所示: #!/bin/bash # # chkconfig: 2345 …

全球智慧能源解决方案服务商「雄韬股份」牵手企企通,谱写采购数字化变革之路

近日,全球知名智慧能源解决方案服务商「深圳市雄韬电源科技股份有限公司」(以下简称“雄韬股份”)与企企通达成合作。本次合作,企企通将为雄韬股份提供专业的采购数字化解决方案,推动企业采购更加智能、高效、透明&…

计算机网络(2)从十六进制的ip数据报中得到详细字段信息

本博文介绍如何将十六进制的ip报文拆分出具体的字段信息。社会计算机网络和网络协议分析的初学者参考(今天看了网络协议分析期末复习重点的最后一个大题,竟然一头雾水,然后快马加鞭翻阅各种资料,然后差不多学会 了)wir…

浏览器输入www.baidu.com后执行的全部过程

日升时奋斗&#xff0c;日落时自省 <1>URL输入 URL称为 : 统一资源定位符,用于定位互联网上的资源,也就是平常提起的"网址" 地址栏输入网址之后按下回车,浏览器会对输入的信息进行评判 (1)检查输入的内容是否是是一个合法的网址连接(非法地址不行) (2)合法的…

Python Unittest框架

1、unittest简介 unittest是Python自带的单元测试框架,具备编写用例、组织用例、执行用例、输出报告等自动化框架的条件,主要适用于单元测试,可以用来作自动化测试框架的用例组织执行框架。 2、unittest框架的特性: 提供用例组织与执行:当测试用例只有几条的时候可以不考虑…

Nginx 02篇——Nginx基本配置与参数说明篇

Nginx 02篇——Nginx基本配置与参数说明篇前言-默认配置文件1. 前言——关于nginx1.1 关于nginx1. 2 Nginx 01篇——Nginx安装2. Nginx 配置文件结构2.1 Nginx 安装后的默认文件2.2 Nginx 的三大组成部分3. 配置参说明-1——整个配置3.1 配置说明3.2 参考4. 配置说明-2—详细说…

postgres 源码解析51 LWLock轻量锁--2

本篇将着重讲解LWLock涉及的主要API工作流程与实现原理&#xff0c;相关基础知识见回顾&#xff1a;postgres 源码解析50 LWLock轻量锁–1 API介绍 函数API功能CreateLWLocks分配LWLocks所需的内存并进行初始化LWLockNewTrancheId分配新的Tranche ID,供用户使用Extension模块…

结构效度分析流程

结构效度分析流程如下图 一、结构效度的意义 效度分析在学术研究中非常常见&#xff0c;结构效度是为了分析“从量表获得的结果与设计该量表时所假定的理论之间的符合程度”。简单来讲&#xff0c;在研究者设计量表之初&#xff0c;一般会预设好几个维度&#xff0c;在经过因子…

kafka入门到精通

文章目录一、kafka概述&#xff1f;1.定义1.2消息队列1.2.1 传统消息队列的使用场景1.2.2 消息队列好处1.2.3 消息队列两种模式1.3 kafka基础架构二、kafka快速入门1.1使用docker-compose安装kafka1.2测试访问kafka-manager1.3 查看kafka版本号1.4 查看zookeeper版本号1.5 扩展…

python学习之OpenCV-Python模块的部分应用示例(生成素描图和动漫图)

文章目录前言一、图片转灰度二、对图片进行二值化处理三、对图片去除噪点四、调整图片透明度五、生成素描滤镜效果图&#xff08;方法结合应用&#xff09;六、生成动漫卡通滤镜效果图&#xff08;方法结合应用&#xff09;总结前言 OpenCV 是一个图像和视频处理库&#xff0c…

掌握饮食健康:了解你的宏量营养素摄入

谷禾健康 // 俗话说“病从口入”&#xff0c;我们的健康状况很大一部分取决于饮食。而食物基本上是由各种营养素构成的。 宏量营养素是人体大量需要的必需营养成分。宏量营养素指的是“三大”营养素&#xff1a;蛋白质、脂肪和碳水化合物&#xff0c;它们是我们饮食中的关键。 …

【JavaScript】基本语法大全

前言&#xff1a; 大家好&#xff0c;我是程序猿爱打拳。在学习C和Java这样的后端编程语言后&#xff0c;我们大概率会学习一些关于前端的语言如HTMLJavaScript。又因为前后端基本语法有些许不同&#xff0c;因此我整理出来。今天给大家讲解的是JS中的数据类型、运算符、选择结…

【华为OD机试模拟题】用 C++ 实现 - 最低位排序(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 货币单位换算(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 选座位(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 停车场最大距离(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 重组字符串(2023.Q1) 【华为OD机试模…

Eth-trunk :LACP模式链路聚合实战

Eth-trunk : LACP模式链路聚合实战 需求描述 PC1和PC3数据vlan10 &#xff0c;网段为192.168.10.0 /24PC2和PC4数据vlan20 &#xff0c;网段为192.168.20.0 /24确保设备之间互联互通&#xff0c;使用最大互联带宽并没有环路确保相同网段的PC可以互通判断交换机之间的每个端口…

ros下用kinectv2运行orbslam2

目录 前提 创建工作空间 orbslam2源码配置、测试&#xff1a; 配置usb_cam ROS功能包 配置kinect 前提 vim 、 cmake 、 git 、 gcc 、 g 这些一般都装了 主要是Pangolin 、 OpenCV 、 Eigen的安装 18.04建议Pangolin0.5 创建工作空间 我们在主目录下创建一个catkin_…

Node 10.0.8.6:9003 is unknown to cluster

解决方案解决方案一解决方案一 ① 概念介绍 公网ip&#xff1a;就是任意两台连接了互联网的电脑可以互相ping ip,能够通的ip 内网ip&#xff1a;只是在内网中使用无法与外网连接的ip ②问题背景 在腾讯云上搭建的一个redis集群&#xff0c;集群启动后 可以看到启动节点…

TX Text Control .NET Server for ASP.NET 31.0 SP2 CRK

用于 ASP.NET 31.0 SP2 的 TX 文本控件 .NET 服务器 用于 ASP.NET 的 TX 文本控件 .NET 服务器 TX Text Control Server for ASP.NET 是用于 Web 应用程序或服务的服务器端组件。它是一个完全可编程的 ASP.NET 文字处理器引擎&#xff0c;提供了广泛的文字处理功能。使用 TX Te…