首页 > 数据库 >Mysql之一次完成的sql执行过程

Mysql之一次完成的sql执行过程

时间:2024-07-21 21:53:40浏览次数:10  
标签:事务 刷新 Mysql 服务器 提交 sql 磁盘 日志 执行

Mysql一次完成的sql执行过程是什么

1、客户端请求
客户端通过MySQL协议发送SQL查询或事务到服务器。

2、连接处理
MySQL服务器为每个客户端连接创建一个线程,该线程处理来自客户端的所有请求。

3、SQL解析
服务器首先解析SQL语句,检查语法正确性。

4、查询优化
解析器生成一个或多个执行计划,优化器选择一个最优的执行计划。

5、权限检查
服务器检查连接的用户是否有执行该语句的权限。

6、缓存查询
对于SELECT语句,如果开启了查询缓存,服务器会检查查询结果是否已缓存。

7、锁定机制
根据事务的隔离级别,服务器对涉及的数据进行适当的锁定。

8、缓冲池操作
对于InnoDB存储引擎,数据首先操作在内存中的缓冲池。缓冲池是一块内存区域,用于缓存数据和索引,减少磁盘I/O。
如果数据尚未在缓冲池中,InnoDB将从磁盘读取必要的页面到缓冲池,这个过程称为“页面置换”。

9、日志记录
在数据实际写入或变更前,服务器会将事务记录到日志中,主要是重做日志(Redo Log)和可能的撤销日志(Undo Log):

  • 重做日志:确保事务的持久性,用于崩溃恢复。
  • 撤销日志:支持事务的回滚和MVCC(多版本并发控制)。

10、数据变更
服务器执行实际的数据变更操作,包括插入、更新或删除数据。
数据在缓冲池中更新后,MySQL会根据配置的刷新策略(如innodb_flush_log_at_trx_commit的设置)决定何时将更改刷新到磁盘。
刷新操作涉及将缓冲池中的数据异步或同步写入磁盘,这取决于设置的刷新策略。

11、刷新到磁盘
根据InnoDB的刷新策略,缓冲池中的数据最终会被刷新到磁盘(写入到磁盘上的相应文件中)。这可能涉及到操作系统的I/O调度和磁盘的物理写入操作。

  • innodb_flush_log_at_trx_commit 控制何时将重做日志刷新到磁盘,影响数据的持久性。
  • innodb_buffer_pool_dump_at_shutdown 和 innodb_buffer_pool_load_at_startup 控制在MySQL启动和关闭时是否刷新和加载缓冲池。

12、事务提交
事务完成,服务器提交事务,确保所有变更都是原子的。
当事务准备提交时,必须确保所有的日志记录已经写入到磁盘上的重做日志文件中。这是通过日志缓冲(Log Buffer)刷新到日志文件完成的。

13、反馈客户端
服务器将操作结果发送回客户端。

14、清理和释放
服务器清理资源,如释放锁,关闭线程等。

15、缓存更新
如果操作影响了查询缓存或InnoDB缓冲池,这些缓存将被更新以反映最新的数据状态。

Mysql先提交事务还是提交日志?

在MySQL中,特别是在使用InnoDB存储引擎时,事务的提交过程与日志的提交紧密相关。具体来说:

日志先行:
在事务提交之前,必须先将事务的所有更改记录到日志中,这是为了保证事务的持久性和可靠性。InnoDB的重做日志(Redo Log)是这个过程的关键部分。

重做日志写入:
当事务进行修改操作(如INSERT、UPDATE、DELETE)时,相关的日志首先被写入到重做日志中。重做日志是InnoDB存储引擎特有的,用于记录数据页的物理修改。

事务提交请求:
当应用程序发出事务提交请求时,MySQL服务器首先确保所有的日志记录都已经安全地写入到重做日志中。

日志提交:
一旦重做日志写入完成,日志提交(Log Commit)就发生了。这确保了即使在数据库崩溃的情况下,事务的所有更改都可以被恢复。

事务提交:
根据innodb_log_buffer_size和innodb_flush_log_at_trx_commit的配置,重做日志缓冲区会在一定条件下刷新到磁盘上的日志文件。这一步骤是确保事务日志持久化的关键。
日志提交完成后,MySQL才正式提交事务(Transaction Commit)。此时,更改被永久地应用到数据库中,并且释放了事务过程中持有的锁资源。

数据刷新到磁盘:
事务提交之后,根据InnoDB的缓冲池刷新策略,数据最终会被刷新到磁盘上。这个步骤可以是同步的,也可以是异步的,取决于innodb_flush_log_at_trx_commit配置选项的设置。

二阶段提交:
InnoDB使用二阶段提交(2PC)协议来确保事务的持久性和完整性。在二阶段提交中,第一阶段是准备阶段,此时日志被写入并提交;第二阶段是完成阶段,此时事务被提交。

总结来说,MySQL中的事务提交过程是先确保日志提交,然后才是事务提交。这种日志先行的策略是数据库保证ACID属性(原子性、一致性、隔离性、持久性)的关键。

标签:事务,刷新,Mysql,服务器,提交,sql,磁盘,日志,执行
From: https://www.cnblogs.com/OpenSourceSite/p/18314930

相关文章

  • MSSQL sqli labs部署
    MSSQLsqlilabs部署1.用Win11自带的iis搭建asp网站打开控制面板中的程序部分,点击启用或关闭Windows功能勾选如图选项加载完毕后按win键打开iis打开asp,将启用父路径改为True右键添加网站网站名称可随意写,物理路径改到保存的MSSQLsqlilabs文件夹(有asp文件的文件夹......
  • 基于WebGoat平台的SQL注入攻击
    目录引言一、安装好JAVA二、下载并运行WebGoat三、注册并登录WebGoat四、模拟攻击1.第九题2.第十题3.第十一题4.第十二题5.第十三题五、思考体会1.举例说明SQL 注入攻击发生的原因。2.从信息的CIA三要素(机密性、完整性、可用性)出发,举例说明SQL 注入攻击......
  • sql脚本
    --创建临时表记录分批复制的日志CREATETABLEtemp_copy_log(idINTAUTO_INCREMENTPRIMARYKEY,batch_start_idINT,batch_end_idINT,start_timeDATETIME,end_timeDATETIME,durationINT,records_copiedINT);CREATETABLEdemo_......
  • SQL server基于报错的注入(使用sqlmap进行get shell)
    SQLserver基于报错的注入1.访问MSSQLSQLiLabs网站点击按钮,我们使用GET请求上传参数“id”,当id=1时,页面显示id=1的用户名Dump、密码Dump:2.寻找注入点http://[靶机IP]/less-1.asp?id=1'运行后报错,说明我们可以利用参数“id”作为我们的注入点,根据回显我们可以判断这是字......
  • MapReduce执行流程
    执行流程MapTask执行流程Read:读取阶段MapTask会调用InputFormat中的getSplits方法来对文件进行切片切片之后,针对每一个Split,产生一个RecordReader流用于读取数据数据是以Key-Value形式来产生,交给map方法来处理。每一个键值对触发调用一次map方法Map:映射阶段map方法在获......
  • MySQL入门学习-SQL高级技巧.透视表
        在MySQL中,虽然没有直接提供像Excel中那样的透视表功能,但可以通过一些技巧来实现类似的效果。通常,我们可以使用聚合函数和'GROUPBY' 子句来创建数据的透视表。一、透视表的概念:    透视表是一种数据汇总和分析的工具,它可以将数据按照不同的维度进行......
  • MySQL入门学习-SQL高级技巧.Window Function
        在MySQL中,窗口函数(WindowFunction)是一种强大的分析工具,它可以在查询结果的基础上进行更复杂的计算和分析。一、窗口函数的概念:    窗口函数可以对查询结果的每一行数据,根据指定的分区(Partition)和排序规则(Order)进行计算。它可以在同一查询中同时返回基础......
  • 【QT开发】数据库连接管理QSqlDatabase类详解及实战应用
    QSqlDatabase是Qt提供的一个功能强大且灵活的数据库连接管理类,通过本篇文章的学习,你应该对QSqlDatabase有了全面的理解,能够在自己的项目中正确使用它。QSqlDatabase在用户......
  • MySQL执行状态查看与分析
     当mysql出现性能问题时,一般会查看mysql的执行状态,执行命令:showprocesslist各列的含义列名含义id一个标识,你要kill一个语句的时候使用,例如 mysql>kill207user显示当前用户,如果不是root,这个命令就只显示你权限范围内的sql语句host显示这个语句是从哪个ip的哪个端口上......
  • NSSCTF———Web(sql注入)
    [LitCTF2023]这是什么?SQL!注一下![SWPUCTF2022新生赛]ez_sql[GXYCTF2019]BabySqli                                     点击右下角文章可跳转[LitCTF2023]这是什么?SQL!注一下!首先我们打开......