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

执行语句前要先连接数据库,这是连接器的工作。

前面我们说过,在一个表上有更新的时候,跟这个表有关的查询缓存会失效,所以这条语句就会把表T上所有缓存结果都清空。这也就是我们一般不建议使用查询缓存的原因。

接下来,分析器会通过词法和语法解析知道这是一条更新语句。优化器决定要使用ID这个索引。然后,执行器负责具体执行,找到这一行,然后更新。

与查询流程不一样的是,更新流程还涉及两个重要的日志模块,它们正是我们今天要讨论的主角:redo log(重做日志)和 binlog(归档日志)

重要的日志模块:redo log

当有一条记录需要更新的时候,InnoDB引擎就会先把记录写到redo log(粉板)里面,并更新内存,这个时候更新就算完成了。同时,InnoDB引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做。 InnoDB的redo log是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB,那么总共就可以记录4GB的操作。从头开始写,写到末尾就又回到开头循环写,如下面这个图所示。

write pos是当前记录的位置,一边写一边后移,写到第3号文件末尾后就回到0号文件开头。checkpoint是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。

write pos和checkpoint之间的是还空着的部分,可以用来记录新的操作。如果write pos追上checkpoint,表示满了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把checkpoint推进一下。

有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe

重要的日志模块:binlog

MySQL整体来看,其实就有两块:一块是Server层,它主要做的是MySQL功能层面的事情;还有一块是引擎层,负责存储相关的具体事宜。上面我们聊到的redo log是InnoDB引擎特有的日志,而Server层也有自己的日志,称为binlog(归档日志)。

最开始MySQL里并没有InnoDB引擎。MySQL自带的引擎是MyISAM,但是MyISAM没有crash-safe的能力,binlog日志只能用于归档。而InnoDB是另一个公司以插件形式引入MySQL的,既然只依靠binlog是没有crash-safe能力的,所以InnoDB使用另外一套日志系统——也就是redo log来实现crash-safe能力。

这两种日志有以下三点不同:

  1. redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用。
  2. redo log是物理日志,记录的是“在某个数据页上做了什么修改”;binlog是逻辑日志,记录的是这个语句的原始逻辑,比如“给ID=2这一行的c字段加1 ”。
  3. redo log是循环写的,空间固定会用完;binlog是可以追加写入的。“追加写”是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

有了对这两个日志的概念性理解,我们再来看执行器和InnoDB引擎在执行这个简单的update语句时的内部流程:

  1. 执行器先找引擎取ID=2这一行。ID是主键,引擎直接用树搜索找到这一行。如果ID=2这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。
  2. 执行器拿到引擎给的行数据,把这个值加上1,比如原来是N,现在就是N+1,得到新的一行数据,再调用引擎接口写入这行新数据。
  3. 引擎将这行新数据更新到内存中,同时将这个更新操作记录到redo log里面,此时redo log处于prepare状态。然后告知执行器执行完成了,随时可以提交事务。
  4. 执行器生成这个操作的binlog,并把binlog写入磁盘。
  5. 执行器调用引擎的提交事务接口,引擎把刚刚写入的redo log改成提交(commit)状态,更新完成。

图中浅色框表示是在InnoDB内部执行的,深色框表示是在执行器中执行的。

最后三步看上去有点“绕”,将redo log的写入拆成了两个步骤:prepare和commit,这就是"两阶段提交"

tip

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

怎么把mysql表里的时间往后推移_Mysql实战45讲笔记:2、更新语句的执行以及日志...相关推荐

  1. mysql 更新时间加数字_Mysql实战45讲笔记:8、聚合函数count

    count(*)的实现方式 在不同的MySQL引擎中,count()有不同的实现方式 1. MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count()的时候会直接返回这个数,效率很高: 2. ...

  2. mysql 不让读的锁_MySQL实战45讲阅读笔记-锁

    全局锁 全局锁会对整个数据数据库实例加锁,使用的命令是flush tables with read lock,使用这个命令后其他线程的DML(增删改)语句.DDL(修改.定义表结构)语句和事务提交语句 ...

  3. mysql 写锁需要等待读锁释放吗_Mysql实战45讲笔记:5、全局锁和表锁

    全局锁: 对整个数据库实例加锁. MySQL提供加全局读锁的方法:Flush tables with read lock(FTWRL) 这个命令可以使整个库处于只读状态.使用该命令之后,数据更新语句. ...

  4. MySQL 实战45讲--笔记

    文章目录 MySQL 实战45讲-->笔记 开篇词 基础篇(8讲) 01 | 基础架构:一条SQL查询语句是如何执行的? 1.1 SQL 语句在 MySQL 的各个功能模块中的执行过程. 依次看 ...

  5. mysql执行动态说起来_MySQL实战45讲学习笔记:第十四讲

    一.引子 在开发系统的时候,你可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数.这时候你可能会想,一条 select count(*) from t 语句不就解决了吗? 但是,你会发现 ...

  6. mysql 主键冲突 多个事务回滚_MySQL实战45讲Day38----自增主键不是连续的原因

    一.自增主键不连续的原因: 对于表: CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c` int(11) DEFAULT NULL ...

  7. 丁奇mysql45讲百度云下载_MySQL实战45讲,丁奇带你搞懂MySQL【完结】

    开篇词.这一次,让我们一起来搞懂MySQL.mp3 开篇词.这一次,让我们一起来搞懂MySQL.pdf 01.基础架构:一条SQL查询语句是如何执行的?.mp3 01.基础架构:一条SQL查询语句是如 ...

  8. MySQL实战45讲笔记(三)

    第六讲:全局锁和表锁 根据加锁的范围,MySQL里面的锁大致可以分成全局锁.表级锁和行锁三类. 一.全局锁 全局锁就是对整个数据库实例加锁.MySQL提供了一个加全局读锁的方法,命令是 Flush t ...

  9. mysql事务实战_MySQL实战45讲学习-事务相关笔记

    1.务的特性:原子性.一致性.隔离性.持久性 2.多事务同时执行的时候,可能会出现的问题:脏读.不可重复读.幻读 3.事务隔离级别:读未提交.读提交.可重复读.串行化 4.不同事务隔离级别的区别: 读 ...

最新文章

  1. SAP的安装后基本设定
  2. SPP-Net 是怎么让 CNN 实现输入任意尺寸图像的?
  3. 对角矩阵和类下三角矩阵的频率和质量数据比较
  4. mybatis项目报java.sql.SQLException: Numeric Overflow的异常
  5. Linux命令解释之sudo
  6. Docker入门者手册
  7. 微信小程序云开发入门详细教程
  8. Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java14 的新特性
  9. 标题怎样选择适合自己的导图结构
  10. java括号用法_Java双括弧使用技巧
  11. Java高级编程5-姜国海
  12. ImportError: cannot import name '_validate_leng问题解决
  13. microsoft 的gpt2模型源码学习记录
  14. 【调剂】江西理工大学【地学大数据与人工智能团队】招地理信息、大数据、人工智能专业调剂生...
  15. c语言设计数字增量pi控制器,数字PI控制器的设计与仿真.pdf
  16. 剑灵最新服务器2017,剑灵合区2017 | 手游网游页游攻略大全
  17. android使用邮箱发送验证码
  18. 富翁和陌生人换钱游戏
  19. 孙溟㠭为释永信大和尚篆刻白文图章
  20. 卓训教育:学习就像爬山,努力坚持很重要

热门文章

  1. Java的回调机制--学习笔记
  2. 字节流--IO学习笔记(二)
  3. uve (mui/light7)写APP的使用心得(大坑);
  4. WebAPi添加常用扩展方法及思维发散
  5. 《社交网站界面设计(原书第2版)》——2.11 提问
  6. mysql源代码安装
  7. .Net程序员面试 中级篇 (回答Scott Hanselman的问题)
  8. Visual Studio 2010 Ultimate敏捷利剑:详解Scrum
  9. UML模型中的图-静态图【类图、对象图】
  10. 从零写一个编译器(十一):代码生成之Java字节码基础