【MySQL进阶之路】BufferPool底层设计(上)

news2024/11/15 5:24:26

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!

在我后台回复 「资料」 可领取编程高频电子书
在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!

在这里插入图片描述

BufferPool 底层设计

Buffer Pool 是 MySQL 中的一个很重要的内存结构,MySQL 的增删改查都是直接操作 BufferPool 的,一般设置 BufferPool 的大小为机器内存的 60% ,Buffer Pool 的大小在 /etc/my.cnf 中进行配置:
在这里插入图片描述

那么为什么要有 BufferPool 呢?

为什么不直接更新磁盘上的数据,而是需要设置一套复杂的机制来执行 SQL 呢?

因为针对数据库数据的读写其实是随机的读写,而对于日志文件的读写是顺序的读写,而顺序读写和随机读写速度差距在 2~3 个数量级,磁盘的顺序 IO 几乎可以和操作内存相媲美。

通过 BufferPool 可以保证每个更新请求都是更新内存 BufferPool,然后顺序写日志文件,同时可以保证各种异常情况下的数据一致性,正是通过这套配置,才能让我们的 MySQL 数据库在较高配置的机器上每秒可以抗下几千的读写请求

为什么说数据库数据的读写是随机 IO 呢?

因为数据库存储在磁盘中的数据是会被删除的,我们在写的时候就算一直顺序写,但是如果后边删除了中间的一些数据,那么在之后读就不能顺序读了,因为中间有一些数据已经不存在了

InnoDB 更新数据的 SQL 执行流程

请添加图片描述
1、如果需要更新的数据不在缓冲池中,就先去磁盘中加载数据页,把需要修改数据所在的数据页,缓存到 BufferPool,BufferPool 中缓存的其实就是一个个的数据页

2、修改记录前,写 undo 日志,记录更改前数据,如果事务执行失败,使用 undo 日志进行数据回滚

3、更新 Buffer Pool 中的数据,并且将 redo log 写到 redo buffer 中

4、提交事务时,会做两件事情:将 bin log 日志写入到磁盘,保存操作记录;将 redo buffer 中的 redo log 刷到磁盘中去,保存操作记录。

bin log 会按照一定的策略刷新到磁盘中去(通过 innodb_flush_log_at_trx_commit 参数来控制)

当 bin log 成功写入到磁盘后,接着就会完成事务的最终提交,之后会将更新的 bin log 的文件名称以及 bin log 日志在文件里的位置都写入到 redo log 中去,并且在 redo log 里写入一个 commit 标记

5、数据持久化,IO 线程不定期把 Buffer Pool 中的数据随机写入到磁盘,完成持久化

在 redo log 中写入 commit 标记的原因:

在 redo 日志中记录 commit 标记是为了保证事务提交之后,redo log与 bin log 数据一致

可以假设一种情况:当 bin log 刚写入磁盘之后,MySQL 宕机了,此时 redo log 还没有写入,那么此时就会出现数据的不一致现象

因此,当 bin log 写入磁盘成功后,在 redo log 中加上 commit 标记,这样即使在 bin log 写入磁盘后,MySQL 宕机了,此时 redo log 还没有加上 commit 标记,因此就认为此次事务执行失败

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

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

相关文章

【快速上手QT】02-学会查看QT自带的手册QT助手

QT助手 为什么大家都说QT简单,第一点就是确实简单(bushi)。 我个人觉得最关键的点就是人家QT官方就给你准备好了文档,甚至还有专门的IDE——QtCreator,在QTCreator里面还有很多示例代码,只要你会C的语法以…

飞马座卫星

1960年代马歇尔太空飞行中心的历史显然与建造土星五号月球火箭有关。然而,鲜为人知的是该中心在设计科学有效载荷方面的早期工作。 Fairchild 技术人员正在检查扩展的 Pegasus 流星体探测表面。Pegasus 由马里兰州黑格斯敦的 Fairchild Stratos Corporation 通过马歇…

DC-8靶机渗透详细流程

信息收集: 1.存活扫描: arp-scan -I eth0 -l └─# arp-scan -I eth0 -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:dd:ee:6a, IPv4: 192.168.10.129 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.10…

Linux文件和目录管理

目录基础 Linux操作系统以目录的方式来组织和管理系统中的所有文件。所谓的目录,就是将所有文件的说明信息采用树状结构组织起来。每个目录节点之下会有文件和子目录。 所有一切都从 ‘根’ 开始,用 ‘/’ 代表, 并且延伸到子目录。 bin:B…

Python tkinter树状目录窗口实现

通过tkinter GUI实现读取特定目录下所有目录及文件并在窗口中可选择显示。 通过左右布局实现,左侧为树状目录,右侧为输入框和显示文本框。 目录 tkinter树状目录 左侧树状目录 右侧显示 调用实现窗口 打开目录 打开py文件 总结 tkinter树状目录 …

【C++基础入门】七、指针(定义和使用、所占内存空间、空指针和野指针、const关键字修饰指针、指针和数组、指针和函数)

七、指针 7.1 指针的基本概念 指针的作用: 可以通过指针间接访问内存 内存编号是从0开始记录的,一般用十六进制数字表示可以利用指针变量保存地址 7.2 指针变量的定义和使用 指针变量定义语法: 数据类型 * 变量名; 示例&…

Java应用中各类环境变量的优先级及最佳实践

1.引言 Java应用程序的开发和部署过程中,合理利用各类环境变量是关键之一。不同类型的环境变量,如系统环境变量、进程级环境变量、Java启动参数设置的系统属性以及Spring Boot配置文件中的环境变量,它们之间存在优先级差异。 深入理解这些环…

Ansible command命令模块 这个模块可以直接在远程主机上执行命令,并将结果返回本主机。

目录 参数介绍练习环境配置主机清单配置无密码链接ping模块 command 命令模块也可以用来安装点东西看个路径 command 指定目录来 指定命令 参数介绍 chdir    # 在执行命令之前,先切换到该目录 executable # 切换shell来执行命令,需要使用命令的绝对…

leetcode(滑动窗口)483.找到字符中所有字母异位词(C++详细解释)DAY4

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串&a…

上市公司人工智能转型指数及55个工具变量汇总数据集(2024.2月更新)

一、“智能化转型”发文趋势和主题分布 二、数据来源 上市公司年报、官网,中国知网及各期刊官网等三、时间跨度 工具变量:2022-2024年; 上市公司人工智能转型指数:2007-2021年四、数据范围 中国A股上市公司五、数据展示 序号…

Qt QVariant类应用

QVariant类 QVariant类本质为C联合(Union)数据类型,它可以保存很多Qt类型的值,包括 QBrush,QColor,QString等等,也能存放Qt的容器类型的值。 QVariant::StringList 是 Qt 定义的一个 QVariant::type 枚举类型的变量&…

【Unity游戏设计】跳一跳Day1

一、创建场景 Assets/Secnes:GameAssets创建游戏资源Prefabs存放预制体,Scripts脚本,Sounds声音,Textures图片资源,Materiais材质资源分类存放意识 二、场景建模 注意:alt鼠标左键切换视角 视角与摄像机视角保持一致:Main CameraGameObjectAlign Vie…

React环境配置

1.安装Node.js Node.js官网:https://nodejs.org/en/ 下载之后按默认选项安装好 重启电脑即可自动完成配置 2.安装React 国内使用 npm 速度很慢,可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm。 ①使用 winR 输入 cmd 打开终端 ②依…

【递归】【前序中序后序遍历】【递归调用栈空间与二叉树深度有关】【斐波那契数】Leetcode 94 144 145

【递归】【前序中序后序遍历】【递归调用栈空间与二叉树深度有关】Leetcode 94 144 145 1.前序遍历(递归) preorder2.中序遍历(递归)inorder3.后序遍历(递归)postorder4. 斐波那契数 ---------------&…

易点易动固定资产管理系统:为中大型企业量身定制的固定资产解决方案

现代商业环境中,中大型企业面临着大规模固定资产管理的挑战。传统的手动管理方法往往效率低下、容易出错,给企业带来了许多困扰。幸运的是,现在有了易点易动固定资产管理系统,它为中大型企业提供了一种全新的方式来轻松管理和追踪…

相机图像质量研究(9)常见问题总结:光学结构对成像的影响--工厂镜头组装

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…

PIL Image 使用详解

文章目录 1. 各种图像处理库介绍1.1 读取数据的通道顺序1.2 Python图像处理库(PIL、Pillow、Scikit-image、Opencv) 2、PIL库与Pillow库的区别3 Pillow库3.1 Pillow库特点3.2 Pillow库安装 4、Pillow的Image对象(PIL.Image)4.1 Im…

【Spring源码解读!底层原理进阶】【下】探寻Spring内部:BeanFactory和ApplicationContext实现原理揭秘✨

🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:底层原理高级进阶》 &#x1f680…

代码随想录算法训练营29期|day43 任务以及具体任务

第九章 动态规划 part05 1049. 最后一块石头的重量 II class Solution {public int lastStoneWeightII(int[] stones) {int sum 0;for (int i : stones) {sum i;}int target sum >> 1;//初始化dp数组int[] dp new int[target 1];for (int i 0; i < stones.lengt…

HttpServletResponse接口用于表示状态代码的字段

1. HttpServletResponse接口用于表示状态代码的字段 您已学习了状态代码以及可用于从servlet向客户机发送状态代码的HttpServletResponse接口的字段。下表列出了HttpServletResponse接口表示状态代码的一些其他字段。 字段状态代码描述SC_HTTP_VERSION_NOT_SUPPORTED505服务器…