这是在网上找到的一张流程图,写的比较好,大家可以先看图,然后看详细阅读下面的各个步骤。

执行流程:

1.连接验证及解析

客户端与MySQL Server建立连接,发送语句给MySQL Server,接收到后会针对这条语句创建一个解析树,然后进行优化,(解析器知道语句是要执行什么,会评估使用各种索引的代价,然后去使用索引,以及调节表的连接顺序)然后调用innodb引擎的接口来执行语句。

2.写undo log

innodb 引擎首先开启事务,对旧数据生成一个反向的UPDATE的语句(如果是INSERT会生成反向的DELETE语句),用于提交失败后回滚,写入undo log,得到回滚指针,并且更新这个数据行的回滚指针和版本号(会设置为更新的事务id)。

3.从索引中查找数据

根据查询条件去B+树中找到这一行数据(如果是唯一性索引,查到第一个数据就可以了(因为有唯一性约束),如果是普通索引,会把所有数据查找出来。)

4.更新数据

首先判断数据页是否在内存中?

4.1 如果数据页在内存中

先判断更新的索引是普通索引还是唯一性索引?

4.1.1 普通索引

如果更新的索引是普通索引,直接更新内存中的数据页

4.1.2 唯一性索引

如果更新的索引是唯一性索引,判断更新后是否会破坏数据的唯一性,不会的话就更新内存中的数据页。

4.2 如果数据页不在内存中

先判断更新的索引是普通索引还是唯一性索引?

4.2.1 普通索引

如果是更新的索引是普通索引,将对数据页的更新操作记录到change buffer,change buffer会在空闲时异步更新到磁盘。

4.2.2 唯一性索引

如果是更新的索引是唯一性索引,因为需要保证更新后的唯一性,所以不能延迟更新,必须把数据页从磁盘加载到内存,然后判断更新后是否会数据冲突,不会的话就更新数据页。

5.写undo log(prepare状态)

将对数据页的更改写入到redo log,将redo log设置为prepare状态。

6.写bin log(commit状态),提交事务

通知MySQL server已经更新操作写入到redo log 了,随时可以提交,将执行的SQL写入到bin log日志,将redo log改成commit状态,事务提交成功。(一个事务是否执行成功的判断依据是是否在bin log中写入成功。写入成功后,即便MySQL Server崩溃,之后恢复时也会根据bin log, redo log进行恢复。具体可以看看下面的崩溃恢复原则)

补充资料:

二段提交制是什么?

更新时,先改内存中的数据页,将更新操作写入redo log日志,此时redo log进入prepare状态,然后通知MySQL Server执行完了,随时可以提交,MySQL Server将更新的SQL写入bin log,然后调用innodb接口将redo log设置为提交状态,更新完成。

如果只是写了bin log就提交,那么忽然发生故障,主节点可以根据redo log恢复数据到最新,但是主从同步时会丢掉这部分更新的数据。

如果只是写binlog,然后写redo log,如果忽然发生故障,主节点根据redo log恢复数据时就会丢掉这部分数据。

MySQL崩溃后,事务恢复时的判断规则是怎么样的?(以redolog是否commit或者binlog是否完整来确定)

如果 redo log 里面的事务是完整的,也就是已经有了 commit 标识,则直接提交;

如果 redo log 里面的事务只有完整的 prepare,则判断对应的事务 binlog 是否存在并完整:a. 如果是,则提交事务;b. 否则,回滚事务。

undo log是什么?

undo log主要是保证事务的原子性,事务执行失败就回滚,用于在事务执行失败后,对数据回滚。undo log是逻辑日志,记录的是SQL。(可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。)

在事务提交后,undo log日志不会立即删除,会放到一个待删除的链表中,有purge线程判断是否有其他事务在使用上一个事务之前的版本信息,然后决定是否可以清理,简单的来说就是前面的事务都提交成功了,这些undo才能删除。

change buffer是什么(就是将更新数据页的操作缓存下来)

在更新数据时,如果数据行所在的数据页在内存中,直接更新内存中的数据页。

如果不在内存中,为了减少磁盘IO的次数,innodb会将这些更新操作缓存在change buffer中,在下一次查询时需要访问这个数据页时,在执行change buffer中的操作对数据页进行更新。

适合写多读少的场景,因为这样即便立即写了,也不太可能会被访问到,延迟更新可以减少磁盘I/O,只有普通索引会用到,因为唯一性索引,在更新时就需要判断唯一性,所以没有必要。

redo log 是什么?

redo log就是为了保证事务的持久性。因为change buffer是存在内存中的,万一机器重启,change buffer中的更改没有来得及更新到磁盘,就需要根据redo log来找回这些更新。

优点是减少磁盘I/O次数,即便发生故障也可以根据redo log来将数据恢复到最新状态。

缺点是会造成内存脏页,后台线程会自动对脏页刷盘,或者是淘汰数据页时刷盘,此时收到的查询请求需要等待,影响查询。

mysql更新一条语句_讲讲一条MySQL更新语句是怎么执行的?相关推荐

  1. mysql 左连接b表的一条数据_如果你正在找MySQL精品资源,那来这里看看

    一.mysql的架构介绍 1.mysql采用的是分层设计模式,结合可插拔技术开发的. 2.mysql层次结构为:连接层>服务层>引擎层>存储层. 3.插件式的存储引擎架构将查询处理和 ...

  2. mysql 基础命令语句_分享一波mysql常用语句与命令

    1.设置命令行提示 mysql -uroot -p --prompt="\\u@\\h:\\d \\r:\\m:\\s>" 在my.cnf配置文件里永久配置 prompt=m ...

  3. mysql面向用户是什么意思_原来大厂的MySQL面试会问这些问题!

    1. 写出下面 2 个 PHP 操作 Mysql 函数的作用和区别(新浪网技术部) mysql_num_rows() mysql_affected_rows() 这两个函数都作用于 mysql_que ...

  4. mysql查询第八页_第八节:MySQL之Select指令详解和相关练习

    一. 前言 该篇文章基于之前   https://www.cnblogs.com/yaopengfei/p/7182230.html  的基础上进行补充修改. 1. 简介 就查询而言,可以简单的分为: ...

  5. 面试mysql中怎么创建索引_阿里面试:MySQL如何设计索引更高效?

    有情怀,有干货,微信搜索[三太子敖丙]关注这个不一样的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. ...

  6. jdbc mysql数据库增删查改_通过JDBC对Mysql数据库进行简单的增删改查

    Java 数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法.J ...

  7. mysql 什么是幻读_何为幻读?MySQL又是如何解决幻读的?

    一.什么是幻读 在一次事务里面,多次查询之后,查询的结果集的个数不一致的情况叫做幻读.而多出来或者少的哪一行被叫做 幻行 二.为什么要解决幻读 在高并发数据库系统中,需要保证事务与事务之间的隔离性,还 ...

  8. python向mysql中添加数据标签_用python在MySQL中写入数据和添加数据

    在笔者之前的博文中,已介绍了用python连接与mysql数据库的知识.包括如何安装python连接mysql的pymysql包,如何通过cusor语句将python与mysql连接起来,以及如何用p ...

  9. mysql之触发器详解_学习笔记之MySQL触发器详解

    触发器是由事件来触发某个操作,这些事件包括INSERT语句,UPDATE语句和DELETE语句 创建触发器 创建只有一个执行语句的触发器 CREATE TRIGGER 触发器名 BEFORE|AFTE ...

最新文章

  1. 在Ruby中获取system()调用的输出
  2. 理解 Python 中的多线程
  3. mysql gtid 5.7_MySQL5.7之GTID复制
  4. FileZilla Server : FTP and FTPS Server
  5. 大数据之Spark教程
  6. JS学习笔记2-JavaScript 语法
  7. 克罗内克内积 Kronecker product
  8. 酷开科技 × StarRocks:统一 OLAP 分析引擎,全面打造数字化的 OTT 模式
  9. FusionCharts的使用方法
  10. python圣经是哪本_我的圣经:17年前的那本《Python 2.1 宝典》
  11. Efficient algorithms for polyploid haplotype phasing 多倍体单体型分型的有效算法
  12. python抓取彩票数据_编写python爬虫采集彩票网站数据,将数据写入mongodb数据库...
  13. 副高级职称的要求真的很难达到吗?
  14. 成都宽带100兆360元一年
  15. 16进制高精度计算的加减乘20211001
  16. es6转es5 的6种方式
  17. 目前大数据在金融行业的应用主要体现在哪些方面?
  18. M1卡 S50与S70的区别
  19. 张瑞敏管理箴言100句
  20. oCPC实践录 | oCPC产品设计与出价原理(2)

热门文章

  1. 可视化数据图表制作注意事项
  2. 大数据质量管理策略有哪些
  3. 企业大数据的主要竞争优势
  4. 数据库的几个基本概念
  5. C++算法学习(回溯算法)
  6. Python:提高pip安装速度的网站
  7. python1e2_Python-1 数据类型
  8. c++ 后台 sendstring_苹果狂杀微信后台,微信官方出必杀技!
  9. Java传参是字节还是字符串好_深入分析java传参
  10. mysql 5.6 修改默认字符集_mysql5.6修改默认字符集