我们已经准备好了,你呢?

2024我们与您携手共赢,为您的企业形象保驾护航!

#mysql#在上一篇文章MySQL查询过程中发生了什么中,我们深入了解了MySQL中查询语句的执行过程,重点介绍了执行过程中涉及的完整处理模块。我们了解到,查询语句的执行过程通常会遍历连接器、解析器、优化器、执行器等功能模块,最终到达存储引擎。

本文讲解MySQL语句的执行过程。

以下是一个有主键id和一个整型字段age的建表语句:

create table T(id int primary key, age int);

如果需要增加id为1的行的值,SQL写为

update T set age = age + 1 where id = 1;

首先,可以肯定地说,更新语句也将执行查询语句中使用的相同处理顺序。

关联表更新数据_关联表更新SQL_mysql update 关联表更新

上一篇文章提到,当更新一张表时,与该表关联的查询缓存会失效,因此更新语句会导致与表 T 相关的所有缓存结果被清除,这也是不推荐使用查询缓存的原因。随后,分析器通过词法和语法分析,识别出这是一条更新语句,优化器再确定使用 id 列索引来更新数据,之后执行器承担实际执行的责任,确定需要修改的相关行。

与查询过程相比,更新过程涉及两个关键的日志模块:和。

重做日志

在MySQL中,一个很大的挑战是,如果每次更新操作都需要写磁盘,然后在磁盘上找到对应记录进行修改,整个过程会产生很大的I/O和检索成本。

为了解决这个问题,MySQL 使用预写日志,这意味着在写入磁盘之前需要进行日志记录。

具体来说,当需要更新某条记录时,引擎首先将该记录写入重做日志,并更新内存中的状态。此时,更新过程才算完成。同时,在适当的时候,引擎通常会在系统空闲时间将操作记录更新到磁盘。

如果某一天有大量记录更新导致重做日志达到其容量上限,MySQL 将面临操作暂停。在此期间,重做日志中的某些记录将被发送到磁盘进行更新。随后,相关记录将从重做日志中清除以释放空间。

因此,重做日志是固定大小的,比如可以配置为四个文件一组,每个文件大小为1GB,累计提供4GB容量用于文件操作,从起点开始,一直到终点,从头到尾都是循环写入模式。

mysql update 关联表更新_关联表更新SQL_关联表更新数据

Write pos 指定当前记录位置,随着写入的进行逐渐前进,当到达第三个文件时,从第一个文件开头重新开始写入。同时 check point 指示要清除的数据的当前位置,这也是一个循环。在删除记录之前,会更新数据文件中的条目。

write pos和check point之间的空白区域是容纳新操作的存储位置。

如果写入位置赶上了检查点,则意味着空间已满。此时,任何新的更新操作都必须暂时停止,这需要清除选定的数据以将检查点向前推进。

由于重做日志的存在,即使数据库因为异常突然重启,由于之前提交的记录还保留着,所以数据是可以恢复的。

从MySQL的架构上来看,其本质上由两部分组成:服务器层,主要涉及MySQL的功能方面;存储引擎层,负责具体的数据存储问题。

上面提到了,redo log 是引擎的一个特殊日志,同样,在层内部,也有自己的日志,叫做。

为什么需要两组日志?

这是因为 MySQL 最初没有集成引擎。原生的 MySQL 引擎有,但是没有崩溃恢复功能。只能用作存档。

它被另一家公司以插件的形式引入到MySQL中,它的集成就是为了解决这个问题。由于单独的崩溃安全无法提供崩溃安全能力,因此引入了一套独特的日志系统,即重做日志,以建立崩溃恢复能力。

这两类日志的区别如下:

在概念上理解了这两个日志之后,让我们更深入地了解执行器和引擎在执行更新语句时发生的内部事件序列。

流程执行器向引擎请求获取id=2的数据,由于id为主键,存储引擎采用树状结构查找,找到相关行。如果包含id=2的数据页在内存中已经存在,则立即交给执行器,如果数据页在磁盘上,则必须先将其取出到内存中,再传回执行器。执行器从引擎收到行数据后,将其值加1,将原值从N变为N+1,生成一组新的行数据,然后通过引擎的接口提供给引擎,让引擎写入这些新数据。引擎将这些新行数据整合到内存中,并记录到重做日志中,此时重做日志进入状态。随后,引擎通知执行器执行完成,此事务随时可以提交,执行器记录操作的相应内容并刻录到磁盘。 执行器调用引擎的事务提交接口,促使引擎将之前写入的重做日志修改为状态,从而完成更新。

mysql update 关联表更新_关联表更新SQL_关联表更新数据

redo log的写入分为两个步骤:and,为什么呢?

将重做日志的写入分为“准备”和“提交”两个步骤是有特定目的的,这种机制称为“两阶段提交协议”,增强了事务的可靠性和持久性。

这种两阶段方法可确保仅在安全记录和验证事务的更改后才提交事务,从而有助于数据库的整体一致性和持久性。

总结

MySQL 中更新语句的执行涉及几个关键步骤和日志机制。

MySQL通过重做日志保证数据的一致性、持久性和可恢复性。

重做日志记录物理修改,保证引擎级的数据恢复,还记录逻辑操作,方便复制和数据同步。

恢复数据的时候可以结合备份实现精准的时间点恢复。

这种深入的了解有助于有效地管理和维护 MySQL 数据库。

二维码
扫一扫在手机端查看

本文链接:https://by928.com/4811.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线