MySQL 更新执行的过程

这篇具有很好参考价值的文章主要介绍了MySQL 更新执行的过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

优质博文:IT-BLOG-CN

Select语句的执行过程会经过连接器、分析器、优化器、执行器、存储引擎,同样的 Update语句也会同样走一遍 Select语句的执行过程。

MySQL 更新执行的过程,数据库,mysql,数据库,面试,java,后端,sql,性能优化

但是和 Select最大不同的是,Update语句会涉及到两个日志的操作redo log(重做日志) 和 binlog (归档日志)。

那么 Mysql中又是怎么使用redo logbinlog?为什么要使用redo logbinlog呢?直接执行更新然后存库不就行了吗?还要放在 redo log和 binlog中,这不是多此一举吗?且听我慢慢道来,这里面大有文章。

一、redo log

大家都是知道 Mysql是关系型数据库,用来存储数据的,在访问数据库量大的时候,Mysql读写磁盘访问的效率是非常低的,加上 sql中的条件对数据的筛选过滤,那么效率就更低了。这也是为什么引入非关系型数据库作为作为数据缓存原因,例如:Redis、MongoDB等,就是为了减少 sql执行期间的数据库 io操作。

同样的道理,若是每次执行 update语句都要进行磁盘 io操作、以及数据的过滤筛选,小量的访问和数据量数据库还可以撑住,那么访问量一大以及数据量一大,这样数据库肯定顶不住。基于上面的问题于是出现了redo log日志,redo log日志也叫做 WAL技术(Write-Ahead Logging),他是一种先写日志,并更新内存,最后再更新磁盘的技术,并且更新磁盘往往是在 Mysql比较闲的时候,这样就大大减轻了 Mysql的压力。

redo log的特点就是:redo log是固定大小,是物理日志,属于 InnoDB引擎的,并且写 redo log是环状写日志的形式:

MySQL 更新执行的过程,数据库,mysql,数据库,面试,java,后端,sql,性能优化

如上图所示:若是四组的redo log文件,一组为1G的大小,那么四组就是4G的大小,其中 write pos是记录当前的位置,有数据写入当前位置,那么write pos就会边写入边往后移。而 check point是擦除的位置,因为redo log是固定大小,所以当redo log满的时候,也就是 write pos追上 check point的时候,需要清除 redo log的部分数据,清除的数据会被持久化到磁盘中,然后将 check point向前移动。redo log日志实现了即使在数据库出现异常宕机的时候,重启后之前的记录也不会丢失,这就是 crash-safe能力。

二、binlog

binlog称为归档日志,是逻辑上的日志,它属于 Mysql Server层面的日志,记录着 sql的原始逻辑,主要有两种模式,一个是 statement格式记录的是原始的sql,而 row格式则是记录行内容。那么这样看来 redo log和 binlog虽然记录的形式、内容不同,但是这两者日志都能通过自己记录的内容恢复数据,那么为什么还要这两个日志同时存在呢?只要其中一个不就行了嘛,两个同时存在不就多此一举了嘛。且听我慢慢道来,这里面也大有文章。

因为刚开 Mysql自带的引擎 MyISAM就没有 crash-safe功能的,并且在此之前 Mysql还没有 InnoDB引擎,Mysql自带的 binlog日志只是用来归档日志的,所以 InnoDB引擎也就通过自己 redo log日志来实现 crash-safe功能

三、update执行过程

上面说了那么久两种日志的作用和特点,那么这两种日志究竟和 update执行语句有什么关系呢?先来看图:

MySQL 更新执行的过程,数据库,mysql,数据库,面试,java,后端,sql,性能优化

前提:当前的引擎是使用InnoDB,update语句与 select语句区别主要是这两日志的使用主要是在执行器和引擎之间进行交互时体现的区别。假如执行如下一条简单的更新语句是:

update user set age=age+1 where id =2

上面说过 select语句走过的流程 update语句也会走一遍,当来到执行器的时候:
【1】执行器会调用引擎的读接口,然后找到 id=2的数据行,因为 id是主键索引,索引按照树的搜索找到这一行, 若是数据行已经存在于内存的数据页中就会立即将结果返回,若是不在内存中,就会从磁盘中进行加载到内存中,然后将查询的结果返回。
【2】执行器将返回的结果的age字段+1,并调用引擎的写接口写入更新后的数据行。
【3】引擎获取到更新后的数据行更新到内存和 redo log(也是写入磁盘,顺序写入,比较快)中,并告诉执行器可以随时提交事务,此时的 redo log处于 prepare阶段。
【4】执行器收到引擎的告知后,生成 binlog日志,并且调用引擎的接口提交事务,引擎将 redo log的状态修改为 commit状态,这样这个更新操作算是完成。

四、两阶段提交

上面详细的说了update语句的执行流程,提到了redo log的 prepare 和 commit两个阶段,这就是两阶段提交,两阶段提交的目的是为了保证 redo log日志与 binlog日志保持数据的一致性。若是 redo log写成功 binlog写失败,或者 redo log写失败 binlog写成功,最后使用这两者日志进行数据恢复得到的结果数据都是不一致性的,所以为了保证两个日志逻辑上的一致,使用两阶段进行提交。

五、redo log 与 binlog的总结

最后来对比一下这两种日志:redo是物理的,binlog是逻辑的,redo的大小固定,并且以环状的形式写入数据,数据满的时候需要将 redo日志中擦除数据,并且将擦除的数据持久化到磁盘中。而 binlog以追加日志的形式写入,也就是当日志写到一定大小后,就会切换到下一个,并不会覆盖以前写的日志。binlog 是在 Mysql Server层中使用,因为 binlog没有 crash-safe功能,所以 InnoDB引擎自己实现了 redo log日志的 crash-safe的功能,为了保证这两个日志逻辑上的一致使用两阶段提交。在使用 redo和 binlog这两种日志的时候,可以将参数 innodb_flush_log_at_trx_commit和 sync_binlog都设置为1,它表示每次事务提交的时候,都会将日志持久化到磁盘中。文章来源地址https://www.toymoban.com/news/detail-843110.html

到了这里,关于MySQL 更新执行的过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据库MySQL学习-数据查询(持续更新中...)

    MySQL是DBMS软件系统,通过这些系统来维护管理数据库。 DBMS类似于用于和数据库之间的桥梁。 下载免费的MySQL 社区版,安装后需要下载MySQL workbench vscode phpmyadmin等工具来接入MySQL。 MySQL可以管理多个数据库的,数据库存放在某台主机上面,数据库上级是服务器,服务器是用来

    2024年02月09日
    浏览(60)
  • 【MySQL数据库 | 第二十篇】explain执行计划

    目录  前言: explain:  语法: 总结:         上一篇我们介绍了从时间角度分析MySQL语句执行效率的三大工具:SQL执行频率,慢日志查询,profile。但是这三个方法也只是在时间角度粗略的查看SQL语句效率,我们要想看一个语句的真正性能,还要借助explain来查看SQL语句的优

    2024年02月11日
    浏览(45)
  • 【MySQL数据库】最全安装过程及配置详解

    🧛‍♂️iecne个人主页: : iecne的学习日志 💡每天 关注 iecne的作品,一起进步 💪一起学习,必看iecne 🐳希望大家多多支持🥰一起进步呀!

    2024年02月02日
    浏览(40)
  • 面试宝典(1)——数据库篇(MySQL)

    索引是一种用于加快数据库查询速度的数据结构。 索引可以帮助数据库快速定位到数据库表中特定列的记录,从而加快数据检索和查询的速度。 通过在表的列上创建索引,可以减少数据库系统需要扫描的数据量,从而提高查询效率。 MySQL中,常见的索引类型包括普通索引,

    2024年04月27日
    浏览(34)
  • MySql数据库实现数据存在则更新,不存在则插入

    1.存在则更新(不影响其他字段),不存在则插入 如上语句的意思的意思是如果字段1不存在(主键,索引或者唯一条件不存在),则执行插入语句,存在则执行更新语句,该更新只更新需要的字段,不影响其他字段的值; 2.存在则更新(先删除后更新),不存在则插入 如上

    2024年02月15日
    浏览(35)
  • 【教程】MySQL数据库学习笔记(三)——数据定义语言DDL(持续更新)

    写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 第一章 《认识与环境搭建》 第二章 《数据类型》 第三章 《数据定义语言DDL》 DDL(Data Definition Language,数据定义语言) 是用于定义和管理数据库对象(如表、视图、索引等

    2024年02月20日
    浏览(43)
  • MySQL数据库中的存储过程以及存储函数练习

     字段名       数据类型       主键    外键    非空   唯一    自增       id             INT               是      否       是       是           否    name    VARCHAR(50)   否      否       是       否           否    glass   VARCHAR(50)     否   

    2024年02月15日
    浏览(44)
  • MySQL 更新执行的过程

    优质博文:IT-BLOG-CN Select语句的执行过程会经过连接器、分析器、优化器、执行器、存储引擎,同样的 Update语句也会同样走一遍 Select语句的执行过程。 但是和 Select最大不同的是,Update语句会涉及到两个日志的操作 redo log (重做日志) 和 binlog (归档日志)。 那么 Mysql中又

    2024年03月24日
    浏览(40)
  • 面试八股文Mysql:(2)数据库调优

    数据库优化在提升系统性能是很重要的一个方面,不管是MySQL还是MongoDB还是其它的数据库。 SQL优化在提升系统性能中是成本最低 优化效果最明显的途径,可以让 吞吐量更大,响应速度更快 。如果你的团队在SQL优化这方面搞得很优秀,对你们整个大型系统可用性方面无疑是一

    2024年02月13日
    浏览(46)
  • 精准备份:如何自动化单个MySQL数据库的备份过程

    自动化备份对于维护数据库的完整性和安全性至关重要。本指南将向您展示如何使用Shell脚本来自动化MySQL数据库的备份过程。 首先,这是我们将使用的备份脚本: 1. 保存脚本 将上面的脚本保存到服务器上,比如命名为 db_backup.sh : 粘贴脚本内容到编辑器中,然后保存并退出

    2024年04月11日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包