上一篇文章咱们说了一条查询sql的执行过程。

https://zhuanlan.zhihu.com/p/156155783​zhuanlan.zhihu.com

今天咱们说说一条更新sql的执行过程。同样给出一条简单的sql:

update scores set  score=c+10 where id=1

他的执行流程大致如下:

首先客户端连接mysql服务器,连接后执行sql语句,执行sql的过程需要经过分析器得出它是需要做update操作,再接着经过优化器它决定使用id这个索引,然后经过执行器通过索引找到这一行,最后进行更新操作。

它的整个过程非常和查询sql的流程相似,但是咱们要清楚这是一条更新语句,会造成数据的改变,肯定不会那么简单哪里不简单了呢?更新操作涉及到两个非常重要的日志模块。redo log (重做日志) 和 bin log(归档日志),这个两个才是今天要说的重点。

首先咱们得知道这两个日志是什么?然后再得知道它们是干什么的?

redo log 是 InnoDB 引擎特有,它是属于物理日志,主要用于记录 “某个数据页上做了什么修改” ,而且它的记录空间是固定的并且是会用完的。

bin log 是属于 server 层持有的,主要是在执行器中记录日志,所以mysql所有的引擎都可以使用它。bin log 是属于逻辑日志,它有 statement 和 row 两种模式,statement记录的是执行的sql语句,row记录的是更新行的内容,所以是记录两条,一条是更新前的内容,另外一条是更新后的内容。默认模式是 row 模式。另外 bin log 是会追加写入日志,当日志文件写到一定大小的时候,就会切换到下一个继续写入日志,并且不会覆盖之前的日志文件。

以上就是这两种日志的概念以及作用,那么现在我们说说它们的记录流程。咱们先看下面一张图,黄填充色的为执行器的操作,蓝填充色为InnoDB引擎的操作

图有点长,不过应该很容易看懂。那么现在就来一步一步的分析。

1、首先执行器会找引擎取id=1这条数据;

2、因为id是主键,所以使用树来找到这一行数据。不过引擎先去内存中查找是否有这一页数据;

3、如果有则直接返回数据给执行器;如果没有就会去磁盘把数据读入到内存中,然后返回数据给执行器。

4、执行器就会执行C+10操作;

5、执行器生成新的一行数据;

6、再调用 InnoDB 引擎的写入接口,把数据更新到内存中;

7、InnoDB 引擎写入 redo log 日志,标记状态为 prepare,并且告诉执行器已经更新数据完成,可以随时提交事务;

8、执行器把此操作写入 bin log ,并且把 bin log 写入磁盘;

9、最后执行器调用引擎的提交事务接口,引擎把 redo log 的状态改 commit ,至此整个更新操作完成。

看到这里也许你会冒出几个问题?

1、redo log 空间是固定,那它会不会用完呢?

首先不用担心 redo log 会用完空间,因为它是循环利用的。例如 redo log 日志配置为一组4个文件,每个文件分别为1G。它写的流程如下图:

上图中有两块填充色,黄色和红色,黄色标记着 check point,这表示这当前擦除掉 redo log 的位置,红色标记着 write pos ,这表示着当前记录 redo log 的位置。当 redo log 写满了之后,就会停下来,不再写入数据,会执行擦除 redo log 操作,当然在擦除这些日志之前,都会把数据写入到磁盘中,把数据进行持久化。这样才能保住数据的准确性。

2、为什么要用这两种日志呢?在没有 InnoDB 引擎的时候是没有 redo log 日志的。

因为 InnoDB 引擎的 redo log 可以保证即使数据库突然宕机了或者异常重启了,之前提交的数据是不会丢失的。这个能力咱们称之为 crash-safe。

3、当mysql服务器在执行过程中突然间宕机了,数据会不会丢失?

答案是不会。为什么这么肯定呢?我们可以从第一张图就可以看出来。比如有以下几种情况:

1、写入 redo log 之前宕机了,那么原始数据是不会发送改变的,因为还没有进行事务的提交。

2、如果写入 redo log 之后,写入 bin log之前宕机,那么原始数据还是不会变,因为数据库重启后,因为两种日志的记录没有同步,所以不会有新数据生成。

3、在 redo log 生成commit之前宕机了,数据库重启后 数据会变成更新后的数据,因为这个时候 redo log 和 bin log 都有了记录,所以数据库重启后会自己进行commit,所以这时候的数据就是更新后的数据了。

我们使用 redo log 主要是需要保证 crash-safe 能力,innodb_flush_log_at_trx_commit这个参数设置成1的时候,表示每次事务的redo log都直接持久化到磁盘。这个参数我建议你设置成1,这样可以保证MySQL异常重启之后数据不丢失。

sync_binlog这个参数设置成1的时候,表示每次事务的binlog都持久化到磁盘。这个参数我也建议你设置成1,这样可以保证MySQL异常重启之后binlog不丢失。

好了,今天就说到这里,欢迎留言咱们一起讨论学习。

mysql 拼接sql批量执行_MySql 学习之 一条更新sql的执行过程相关推荐

  1. mysql 书籍推荐 简书_Mysql复习必备----50条经典Sql语句

    关于学生,课程,成绩,教师表 student(学号#,姓名,性别,年龄) course(课程号#,课程名,教师号#) score(学号#,课程号#,成绩) teacher(教师号#,教师名) --1. ...

  2. 一条更新SQL语句是如何执行的?

    前言 在上篇文章<一条查询SQL语句是如何执行的?> 介绍了一些常用组件,一般是经过连接器.分析器.优化器.执行器等功能模块,最后到达存储引擎.本文是介绍一条更新语句如何执行,还会介绍一写 ...

  3. mysql 拼接sql批量执行_Mysql 学习笔记之 SQL 执行过程

    写在开始 本系列源自极客时间 MySQL 专栏,整理而成 在执行下面这个查询语句时的执行的流程是怎么样的? mysql 看过相关资料的同学都可能知道执行流程大概是这样的: 其执行过程为:连接.查询缓存 ...

  4. mysql左对齐原则_Mysql学习,这21个SQL语句优化规范方法你知道吗

    前言 每一个好习惯都是一笔财富,本文分SQL后悔药, SQL性能优化,SQL规范优雅三个方向,分享写SQL的21个好习惯,谢谢阅读,加油哈~ github地址,感谢每颗star  github.com ...

  5. mysql表文件与结构_MySQL文件结构、逻辑架构及sql执行流程分析

    1.MySQL文件说明 1.1 MySQL文件夹文件 linux服务器上MySQL安装好之后都有如下文件: auto.cnf:每一个MySQL实例都有一个唯一ID 蓝色文件夹:表示数据库,每个数据库对 ...

  6. mysql有没有批量游标_MySQL使用游标批量处理进行表操作_MySQL

    一.概述 本章节介绍使用游标来批量进行表操作,包括批量添加索引.批量添加字段等.如果对存储过程.变量定义.预处理还不是很熟悉先阅读我前面写过的关于这三个概念的文章,只有先了解了这三个概念才能更好的理解 ...

  7. Mysql更新数据库数据sql_一条更新SQL在MySQL数据库中是如何执行的

    前边的在<一条SQL查询在MySQL中是怎么执行的>中我们已经介绍了执行过程中涉及的处理模块,包括连接器.分析器.优化器.执行器.存储引擎等.今天我们来一起看看一条更新语句又是怎么一个执行 ...

  8. mysql导出excel出乱码_Mysql中文乱码以及导出为sql语句和Excel问题解决方法[图文]...

    一.导出数据. 先说明一下自己的环境:Mac OS X 10.8.3, MySQL Community Server 5.6.10, MySQL Workbench 5.2.47. 我想把本机数据库内 ...

  9. db2关闭下一句sql的日志_MySQL性能管理及架构设计:SQL查询优化、分库分表

    作者:唐成勇 来源:https://segmentfault.com/a/1190000013781544 一.SQL查询优化(重要) 1.1 获取有性能问题SQL的三种方式 通过用户反馈获取存在性能 ...

最新文章

  1. 多任务学习,如何设计一个更好的参数共享机制?| AAAI 2020
  2. 华为路由器的常用命令
  3. VMware虚拟机直连物理网络的两种方式
  4. linux c 之sigsuspend 进程阻塞
  5. GNU (内部)make函数
  6. Servlet第二篇【Servlet调用图、Servlet细节、ServletConfig、ServletContext】
  7. www.android ind.com,Android
  8. golang select总结
  9. rename批量修改文件名
  10. linux下ssh/scp无密钥登陆方法
  11. 如何选择自己适合的引流平台?
  12. 耐人深思的总结,牛牛牛
  13. c语言 万年历问题,【数组函数面试题】面试问题:万年历的C语言… - 看准网
  14. Linux基础—3.Linux基础命令总结【有图有真相】
  15. PHP文件上传实现的注意点
  16. java私塾跟我学系列_java 私塾作业
  17. 【目标检测】雷达目标CFAR检测算法
  18. 国产数据库及厂商介绍
  19. 轻轻一扭,迎来温暖柔风,告别手脚冰凉,卡蛙桌面暖风机上手
  20. JAVA操作共享文件夹文件、下载、读取(windows、Linux通用)

热门文章

  1. java处理最后一周_Java获取某年某周的最后一天
  2. 取消挂载点可以节省磁盘么_Linux下NTFS格式外接硬盘的挂载,取消挂载和开机自动挂载...
  3. 如何将excel表格内的数据导入至mysql数据库
  4. 给列名称命名_批量提取文件名,然后换上新名称
  5. 一分钟带你快速进入Nacos的世界,史上最简易教程!零基础也能看明白!谁反对?
  6. vuepress 2.x 集成 element-plus
  7. [USACO1.3]滑雪课程设计Ski Course Design
  8. Kuangyeye and hamburgers
  9. java中日期比较方法_在java中进行日期时间比较的4种方法
  10. Apache Hive on Apache Tez