MySQL语句如何执行,出现宕机怎么回事?

xzdxmynet 发布于 2024-01-26 阅读(38)

本文主要详细介绍如何执行MySQL语句以及出现宕机时会发生什么情况。 文章中的介绍非常详细,有一定的参考价值。 有兴趣的朋友可以参考一下。 希望对你的学习或者工作有所帮助。 有帮助。

本文为您带来MySQL的相关知识,主要介绍语句如何执行的相关问题。 当执行更新操作时,与表相关的查询缓存将失效,因此该语句将删除表上的所有信息。 缓存结果全部清除。 让我们一起来看看吧。 希望对大家有所帮助。

前期准备

首先创建一个表,然后插入三条数据:

CREATE TABLE T(
	ID int(11) NOT NULL AUTO_INCREMENT,
	c int(11) NOT NULL,
	PRIMARY KEY (ID)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试表';INSERT INTO T(c) VALUES (1), (2), (3);

稍后我们再进行更新操作:

update T set c=c+1 where ID=2;

在讲update操作之前,我们先来看看MySQL中sql语句的执行流程~

SQL语句执行流程

如图所示:MySQL数据库主要分为两层:服务层和存储引擎层。 服务层:该层包括连接器、查询缓存、分析器、优化器和执行器,包括MySQL中的大部分核心功能。 存储引擎的功能也在这一层实现,包括存储过程、触发器、视图等。 存储引擎层:存储引擎层包括MySQL常用的存储引擎,包括 、 、 、 。 最常用的是MySQL的默认存储引擎。

层组件简介

优化器:经过分析器分析后,SQL是合法的,但在执行之前,需要经过优化器的处理。 优化器将确定使用哪个索引以及使用哪个连接。 优化器的作用是确定最高效率。 执行计划。

执行者:在执行阶段,MySQL会首先判断是否有权限执行该语句。 如果没有权限,则会返回无权限错误; 如果有权限,就会打开表并继续执行。 当一个表被打开时,执行器会根据引擎的定义使用目标引擎提供的接口。 对于有索引的表,执行逻辑类似。

了解完SQL语句的执行流程后,我们来详细分析上面的T是如何set c=c+1 where ID=2; 被执行。

报表分析

update T set c=c+1 where ID=2;

当执行更新操作时,与该表相关的查询缓存将失效,因此该语句将清除表T上的所有缓存结果。接下来,分析器将进行语法分析和词法分析。 知道这是一条更新语句后,优化器决定使用哪个索引,然后执行器负责具体执行。 它首先找到该行,然后更新它。

按照我们通常的思路,我们只要找到这条记录,改变它的值,然后保存就可以了。 但让我们深入了解细节。 既然涉及到修改数据,那就涉及到日志。 更新操作涉及到两个重要的日志模块。 redo log(重做日志)、bin log(归档日志)。 MySQL中的这两个日志也是必须要学习的。

重做日志(redo log)

听完上面对重做日志的介绍,朋友们可能会问:重做日志存储在哪里? ,数据库信息保存在磁盘上,重做日志也保存在磁盘上。 为什么要先写入重做日志,再写入数据库? 、重做日志数据满了怎么办? 等等,接下来我们来回答这些问题。

重做日志存储在哪里?

引擎首先将记录写入重做日志。 无论重做日志在哪里,它也在磁盘上。 这也是一个写入磁盘的过程。 但与更新过程不同的是,更新过程涉及到磁盘上的随机IO,比较耗时。 写入重做日志是磁盘上的顺序IO。 要有效率。

重做日志空间是固定的,会不会用完?

首先,不需要担心重做日志空间不足,因为它是被回收的。 例如,redo log日志配置为一组4个文件,每个文件1G。 其编写过程如下:

简单总结一下:重做日志是存储引擎特有的一种机制,可以用来应对异常恢复。 崩溃安全,重做可以保证当mysql异常重启时,未提交的事务被回滚,已提交的事务安全地落入数据库。

Crash-safe:借助重做日志,可以保证即使数据库异常重启,之前提交的记录也不会丢失。 这种能力称为碰撞安全。

(存档日志)

重做日志是引擎特定的日志。 是mysql层的日志。

其实bin日志比redo日志出现得更早,因为MySQL一开始是没有存储引擎的,5.5之前。 但如果没有崩溃安全功能,日志只能用于归档。 但另一家公司以插件的形式推出了MySQL。 由于单独依靠它并不具备崩溃安全的能力,因此需要使用另一个日志系统,即重做日志来实现崩溃安全的能力。

redo log 和 bin log 总结 redo log 和 bin log 的区别:执行这个简单语句时引擎部分的内部流程

update T set c=c+1 where ID=2;

手动使用begin开启事务,然后执行语句,然后执行语句。 上面的更新过程哪些是在语句执行之前和之后进行的,哪些是在语句执行之后进行的?

事实上,重做日志在内存和缓存中都有重做日志。 所以在手动开启的事务中,当你执行SQL语句时,实际上是写入到重做日志和缓存中(当然不可能直接写入磁盘日志,一是性能差,二是不可能回滚时回滚磁盘日志),那么执行时必须先将重做日志的提交状态更改为status,然后刷新缓存到日志(可能只会刷新到操作系统的页缓存(这个取决于你的mysql配置),并且redo log刷新到redo log(刷新时机也是可配置的),如果回滚,只需清除缓存和redo log中的数据即可。

如果过程中mysql突然崩溃了怎么办?

以上是介绍了MySQL语句是如何执行的,以及如果出现宕机会发生什么情况。 本文内容仅供参考。 有需要的朋友可以借鉴一下。 希望对你的学习或者工作有所帮助。 如果您想了解更多,请关注群英网。 小编每天都会为大家更新不同的知识。

标签:  mysql log文件 sql优化 mysql数据库 

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。