【高频】从准备更新一条数据到事务的提交的流程描述

2024-06-13 04:20

本文主要是介绍【高频】从准备更新一条数据到事务的提交的流程描述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、相关问题

  1. SQL语句是如何被MySQL解析和分析的?
  2. MySQL是如何为SQL语句生成最优的执行计划的?
  3. 执行计划的各个步骤是如何一步步执行的?
  4. MySQL是如何访问存储引擎得到数据的?
  5. MySQL是如何将查询结果返回给客户端的?
  6. MySQL是如何处理事务的?

参考回答:

  • 首先执行器根据 MySQL 的执行计划来查询数据,先是从缓存池中查询数据,如果没有就会去数据库中查询,如果查询到了就将其放到缓存池中
  • 在数据被缓存到缓存池的同时,会写入 undo log 日志文件
  • 更新的动作是在 BufferPool 中完成的,同时会将更新后的数据添加到 redo log buffer 中
  • 完成以后就可以提交事务,在提交的同时会做以下三件事
    • 将redo log buffer中的数据刷入到 redo log 文件中
    • 将本次操作记录写入到 bin log文件中
    • 将 bin log 文件名字和更新内容在 bin log 中的位置记录到redo log中,同时在 redo log 最后添加 commit 标记

著作权归@pdai所有 原文链接:https://pdai.tech/md/db/sql-mysql/sql-mysql-execute.html

二、过程详解:

1.系统和数据库的连接

Mysql驱动在底层做数据库的连接,只有建立了连接,才能进行交互。一次SQL请求就会建立一个连接,多个请求就会建立多个连接,而web系统一般都是部署在tomcat容器中的,tomcat是可以并发处理多个请求的,这就会导致多个请求会去建立多个连接,再关闭,会大大降低系统的性能,因此采用数据库连接池进行连接。业务系统是并发的,因此系统和MySQL的架构体系中也已经提供了数据库连接池,双方都是通过数据库连接池来管理各个连接。【好处:线程之间不需要争抢,不需要反复放入创建和销毁连接。】

数据库连接池:维护一定的连接数,方便系统获取连接,使用时就去池子中获取,用完就放回去。不必关心连接的创建与销毁,也不必关心线程池如何维护连接。

网络中的连接都是由线程来处理的,对于 SQL 语句的请求在 MySQL 中是由一个个的线程去处理的。MySQL 中处理请求的线程在获取到请求以后获取 SQL 语句去交给 SQL 接口去处理。

2.查询、解析、优化、执行

查询(Query)

  • 这是SQL语句真正执行查询的核心阶段。
  • MySQL会根据之前生成的执行计划,调用存储引擎执行具体的查询操作。
  • 存储引擎会根据索引或全表扫描等方式访问数据页,并返回匹配的数据行

解析(Parse)

  • 解析器会将SQL接口传递过来的SQL语句进行解析。
  • 会先对SQL语句进行语法分析和验证,确保语句符合SQL标准。
  • 这个阶段会生成一个抽象语法树(AST)作为内部表示。

优化(Optimize)

  • MySQL的优化器会分析AST,结合统计信息选择最优的执行计划。
  • 优化器会考虑索引、表连接顺序、子查询等因素进行优化,选择成本最低的执行方案。
  • 可以使用EXPLAIN命令查看MySQL选择的执行计划。

执行(Execute)

  • 根据优化器生成的执行计划,MySQL会调用存储引擎执行具体的查询操作。
  • 这个阶段就是实际执行查询、返回结果集的过程。
  • MySQL会监控SQL语句的执行情况,可以通过SHOW PROCESSLIST查看当前正在执行的语句

3.存储引擎

执行 SQL 的时候 SQL 语句对应的数据一般加载到内存中,这块内存就是 InnoDB 中一个非常重要的组件:缓冲池 Buffer Pool【Buffer Pool (缓冲池)是 InnoDB 存储引擎中非常重要的内存结构,顾名思义,缓冲池其实就是类似 Redis 一样的作用,起到一个缓存的作用

SQL 语句的执行步骤

  • innodb 存储引擎会在缓冲池中查找 id=1 的这条数据是否存在
  • 发现不存在,那么就会去磁盘中加载,并将其存放在缓冲池中
  • 该条记录会被加上一个独占锁

undo 日志文件:记录数据被修改前的样子

redo 日志文件:记录数据被修改后的样子

redo 日志文件是 InnoDB 特有的,他是存储引擎级别的,不是 MySQL 级别的

MySQL 的执行器调用存储引擎的过程:

  • 准备更新一条 SQL 语句
  • MySQL(innodb)会先去缓冲池(BufferPool)中去查找这条数据,没找到就会去磁盘中查找,如果查找到就会将这条数据加载到缓冲池(BufferPool)中
  • 在加载到 Buffer Pool 的同时,会将这条数据的原始记录保存到 undo 日志文件中
  • innodb 会在 Buffer Pool 中执行更新操作
  • 更新后的数据会记录在 redo log buffer 中
  • MySQL 提交事务的时候,会将 redo log buffer 中的数据写入到 redo 日志文件中 刷磁盘可以通过 innodb_flush_log_at_trx_commit 参数来设置
    • 值为 0 表示不刷入磁盘
    • 值为 1 表示立即刷入磁盘
    • 值为 2 表示先刷到 os cache
  • myslq 重启的时候会将 redo 日志恢复到缓冲池中

参考博文:MySQL - 一条 SQL 的执行过程详解 | Java 全栈知识体系

 

这篇关于【高频】从准备更新一条数据到事务的提交的流程描述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1056264

相关文章

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例