mysql面试(二)

news2024/11/15 11:10:00

前言

这是mysql面试基础的第二节,主要是了解一下mysql数据更新的基本流程,还有三大日志的作用。但是具体的比如undolog是如何应用在mvcc机制中的,由于篇幅问题就放在下一在章节

数据更新流程

上面是说了更新真正数据之前的大致流程,下面来说一下更新数据的时候具体会进行哪些操作。

InnoDB重要的内存结构:缓存池

首先是存储引擎访问数据的时候,并不会直接对磁盘进行操作,而是先在内存的缓存池中进行查询,如果查询不到的话再到磁盘中取拿数据,这样能减少大量磁盘的直接操作。
并且执行更新语句的时候,不仅要把数据更新到缓存池中,还需要对数据加独占锁,避免同时有其他数据来进行更新操作(这个独占锁包含行锁、间隙锁,后面再具体聊)

更新undo日志

undoLog起到最重要的作用就是记录数据更新之前的原始数据,以及该线程的事务(在mvcc机制中会用到)。举个栗子,比如我们要把id=1的数据中name=zhangsan 改为name=lisi。那么就需要吧id=1 name=zhangsan这个数据线记录下来,并且标记事务id。

更新buffer pool缓存页

前面的步骤已经拿出来数据,并且加了锁防止其他线程更新,原始数据也进行记录了。这时候就可以把缓存池中的数据进行修改了,把id=1这条数据的name字段修改为lisi。
这时候这条数据就属于一条脏数据,因为在内存中和磁盘中的数据不一致。

更新redoLog

现在已经对缓存中的数据进行了修改,并且记录了原始数据,这么多操作步骤,都需要记录到这个redoLog日志中,它是InnoDB的核心日志。更新的时候会在这个redo日志中新增记录一条“id=1的数据修改了name字段,值改为了lisi”类似这种形式的日志记录。
在当前步骤的所有操作都是在内存中,并没有进行磁盘的物理数据进行操作。所以这个时候也是不怕服务突然宕机断电之类的极端情况,因为如果宕机,内存丢失,对于磁盘数据也是没有任何影响的,下次查询的时候重新从磁盘中获取之前的数据就可以了。

binLog

在更新缓存数据和日志到磁盘之前,还有一个binLog日志也是需要了解的,虽然它记录的数据和redoLog很类似,也是“某个时刻对某某数据进行了某某操作”。但是它和redoLog最大的区别就是redoLog是InnoDB是引擎自己的组件,而binLog是mysql server自己的日志文件。

提交事务

进行了这么多步骤,终于要提交事务了。要提醒的一点是,undoLog、redoLog、binLog都是会在提交事务的这个步骤中写入磁盘中
什么时候更新进磁盘其实是可以配置的
根据innodb_flush_log_at_trx_commit来配置,它有几个选项
当值为0时:提交事务同时,redo日志不会写入磁盘,一旦mysql崩溃便会丢失
当值为1时:提交事务同时,redo日志写入磁盘。
当值为2时:提交事务同时,redo日志会先写入磁盘缓存os cache,过一段时间 可能是一秒钟 再写入磁盘

再次更新redoLog

在commit之后,会在redoLog日志中标记本次更新已经commit,并且会将本次更新对应的binLog文件名称和文件的位置都记录进redoLog中去。标记完mysql的IO线程会随机将缓存中修改后的数据刷进磁盘中
更新流程类如图:
在这里插入图片描述

三大日志

binlog

我们上面已经说了binLog存储的大致数据以及更新时间,其实他的更新策略也是可以修改的
数据同步会使用这个日志,可以扩展一下这一点。
syuc_binlog参数可以控制binlog的刷盘策略。
当值为0时:提交事务时只将binlog存入os cecha缓存
当值为1时:提交事务时会将binlog同步写入磁盘

redoLog

为什么要使用redo log,它可以保证我们在事务提交之后,哪怕缓存中更新的数据没有被刷新到磁盘上,也不会丢失,如果宕机了,根据redolog就可以恢复更新的缓存。
redo log本质上记录的就是在什么位置修改了什么值表空间号+数据页号+偏移量+修改几个字节的值+具体的值
redo log中有一个redo log block的概念,可以理解为是redo log日志的一个个子单元,每个有512字节,那么写入redo log的时候也是这样一个个小单元顺序放进去的;并且将redo log刷进磁盘的时候,也是按照这样一个个小单元更新的。
更新磁盘数据的时候,是先放在redo log buffer缓冲区的,每隔一定时间,把这些数据刷进磁盘中

undoLog

什么是undo log?这个存在是为了做数据回滚的,不仅会存入数据的历史版本,而且会生成反操作语句。比如我们当前一个请求有删除和插入两个操作,当第一个删除delete操作执行完的时候,undo log中会有一个反操作语句insert;就是为了在插入操作失败的时候,用来删除操作的回滚。

预告

为了避免篇幅太长,MVCC机制就放在下一章节

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

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

相关文章

19023 砍树

这个问题可以通过二分查找来解决。我们可以设定一个范围&#xff0c;然后在这个范围内查找最大的高度&#xff0c;使得砍下的木材长度至少为M。 以下是C的解决方案&#xff1a; #include <iostream> #include <vector> #include <algorithm> using namespa…

解决R语言找不到系统库导致的报错

1、基本需知 1.1、系统库 系统库&#xff08;System library&#xff09;是一组预先编写和编译好的软件模块集合&#xff0c;用于支持操作系统的基本功能和提供一些常见的服务。这些库通常由操作系统或第三方开发者提供&#xff0c;并且在系统安装过程中被预装或者用户可以额…

【Linux】通过分配虚拟内存的方式来解决因内存不够而导致部署的项目自动挂掉

多个 jar 包项目部署在同一台服务器上&#xff0c;当服务器配置低&#xff0c;内存不足时&#xff0c;有可能出现 nohup java -jar 启动的进程就莫名其妙挂掉的问题。 解决方式&#xff1a; 第一种方法&#xff1a;进行JVM调优可以改善这种情况&#xff0c;但是项目太多&…

DNS域名管理系统、搭建DNS服务

1.DNS概述 1.DNS&#xff08;domain name system &#xff09; 域名管理系统 域名&#xff1a; 由特定的格式组成&#xff0c;⽤来表示互联⽹中某⼀台计算机或者计算机组的名称&#xff0c;能够使⼈更⽅便的访问互联⽹&#xff0c;⽽不⽤记住能够被机器直接读取的IP地址。 计算…

JS+H5可视化广度优先算法

源码在效果图后面 可标记 障碍 起始点 终点 点击寻路按钮后&#xff0c;表格上会自动出现一条蓝色最佳路径&#xff08;加了一格一格显示的动画&#xff09; 以下是效果图 橙色起点 绿色终点 红色障碍物 以下是寻路结果 源代码 <!DOCTYPE html> <html lang&quo…

「运费速查神器」精明买家必备!一键查询1688供应商发货费用

对于从事跨境买家还是国内电商买家&#xff0c;在选品时&#xff0c;需要全面考虑商品成本&#xff0c;发货费用是供应链成本的重要组成部分。 原来如果我们在1688选品看供应商发货运费&#xff0c;需要一个个单独点击到商品的详情页去查看&#xff0c;再选择具体的收货地、再…

【C# WInForm】将TextBox从输入框设置为文本框

1.需求情形&#xff1a; textbox作为最常用的控件之一&#xff0c;通常是用来输入文本信息或者显示文字&#xff0c;但是如果要在界面中显示大段文本&#xff0c;一个带有边框、可选中的文本样式似乎不合适。像这样&#xff1a; 我需要的是这段文字不仅能跨行&#xff0c;而且…

浏览器打开PDF卡在加载(侧边翻译插件打不开PDF)

如果你的浏览器安装了一些翻译插件&#xff0c;那么可能会导致PDF加载不出来 比如我的浏览器中安装了“侧边翻译”&#xff0c;而我在view Elsever的论文时出现了加载不出来的问题—— 仍然以此扩展为例&#xff0c;那么解决办法是&#xff1a; 取消勾选——

2023 N1CTF-n1proxy

文章目录 参考rsa握手rust_proxy源码公匙交换和签名会话钥匙后续通信生命周期和裸指针代码审计漏洞点 libc-2.27.so大致思路&#xff08;exp还有变化&#xff09;调试exp泄露libc写free_hook执行命令exp 参考 https://github.com/Nu1LCTF/n1ctf-2023/tree/main/pwn/n1proxy ht…

【数据结构】AVL树(平衡二叉搜索树)

文章目录 1.AVL树1.1 AVL树的概念1.2 AVL树节点的定义1.3 AVL树的插入1.4 AVL树的旋转1.4.1 左单旋1.4.2 右单旋1.4.3 右左双旋1.4.4 左右双旋 1.5 AVL树的平衡验证1.6 AVL树的删除1.7 AVL树的性能 1.AVL树 在前面&#xff0c;我们已经介绍过了二叉搜索树&#xff0c;也了解到…

03 capture软件操作界面和常用设置介绍04 capture软件自带元件库设置

03 capture软件操作界面和常用设置介绍&&04 capture软件自带元件库设置 第一部分 03 capture软件操作界面和常用设置介绍一、分辨率二、产品选择三、颜色设置四、格点设置 第二部分 04 capture软件自带元件库设置 第一部分 03 capture软件操作界面和常用设置介绍 一、…

初识c++:string类(2)

#本节主要讲解c&#xff1a;string类的模拟实现 全部代码的实现在最后面&#xff01;&#xff01;&#xff01;有需要的自己往下滑&#xff0c;自取&#xff01;&#xff01;&#xff01;1.string类的模拟实现 2.浅拷贝 3.深拷贝 目录 #本节主要讲解c&#xff1a;string类…

使用Ollama和OpenWebUI,轻松探索Meta Llama3–8B

大家好&#xff0c;2024年4月&#xff0c;Meta公司开源了Llama 3 AI模型&#xff0c;迅速在AI社区引起轰动。紧接着&#xff0c;Ollama工具宣布支持Llama 3&#xff0c;为本地部署大型模型提供了极大的便利。 本文将介绍如何利用Ollama工具&#xff0c;实现Llama 3–8B模型的本…

WEB前端10- Fetch API(同步/异步/跨域处理)

Fetch API Fetch API 可以用来获取远程数据&#xff0c;用于在 Web 应用程序中发起和处理 HTTP 请求。它基于 Promise&#xff0c;提供了一种简单而强大的方式来处理网络通信&#xff0c;替代了传统的 XMLHttpRequest。 Promise对象 Promise 对象是 JavaScript 中处理异步操…

Netty:基于NIO的 Java 网络应用编程框架

Netty 是一个被广泛使用的&#xff0c;基于NIO的 Java 网络应用编程框架&#xff0c;Netty框架可以帮助开发者快速、简单的实现客户端和服务端的网络应用程序。“快速”和“简单”并不用产生维护性或性能上的问题。Netty 利用 Java 语言的NIO网络编程的能力&#xff0c;并隐藏其…

C++ 鼠标轨迹API【神诺科技SDK】

一.鼠标轨迹模拟简介 传统的鼠标轨迹模拟依赖于简单的数学模型&#xff0c;如直线或曲线路径。然而&#xff0c;这种方法难以捕捉到人类操作的复杂性和多样性。AI大模型的出现&#xff0c;使得神诺科技 能够通过深度学习技术&#xff0c;学习并模拟更自然的鼠标移动行为。 二.…

Spring Security 介绍

1.概要 Spring Security是一个用于在Java应用程序中实现身份验证和访问控制的强大框架。它可以轻松地集成到任何基于Spring的应用程序中&#xff0c;提供了一套丰富的功能来保护应用程序的安全性。 https://spring.io/projects/spring-security/ demo:https://docs.spring.i…

Java使用AsposePDF和AsposeWords进行表单填充

声明&#xff1a;本文为作者Huathy原创文章&#xff0c;禁止转载、爬取&#xff01;否则&#xff0c;本人将保留追究法律责任的权力&#xff01; 文章目录 AsposePDF填充表单adobe pdf表单准备引入依赖编写测试类 AsposeWord表单填充表单模板准备与生成效果引入依赖编码 参考文…

Java | Leetcode Java题解之第275题H指数II

题目&#xff1a; 题解&#xff1a; class Solution {public int hIndex(int[] citations) {int n citations.length;int left 0, right n - 1;while (left < right) {int mid left (right - left) / 2;if (citations[mid] > n - mid) {right mid - 1;} else {lef…

【Hot100】LeetCode—322. 零钱兑换

目录 题目1- 思路2- 实现⭐322. 零钱兑换——题解思路 3- ACM 实现 题目 原题连接&#xff1a;322. 零钱兑换 1- 思路 思路 其中 amount 是背包容量 ——> 其中 nums 数组代表的背包重量 2- 实现 ⭐322. 零钱兑换——题解思路 class Solution {public int coinChange(in…