一个人至少拥有一个梦想,有一个理由去坚强

心若没有栖息的地方,到哪里都是在流浪

MySQL实站45讲学习笔记—02|日志系统:一条sql更新语句是怎么执行的

正如第一篇笔记一样,我们知道了mysql的基本架构,也明白了一条查询语句的执行流程,现在我们来了解一条sql更新语句的执行方式。和查询语句差不多,区别主要两点:

  • 连接器通过后,不再去查询缓存,而是要清空缓存,其他步骤都不变。因为更新操作都会清空缓存,这也正是一般不建议使用查询缓存的原因。
  • 更新流程涉及两个重要的日志模块——redo log(重做日志) + binlog(归档日志)

redo log:

redo log 是InnoDB引擎特有的,当有一条记录要更新的时候,InnoDB引擎会把记录写到redo log里,并更新内存。redo log相当于”黑板”,是有固定大小的,如果记录到了结尾,则又回到开头循环写。

主要作用:有crash-safe能力。即使数据库发生异常重启,之前提交的记录都不会丢失。

binlog:

binlog是server层有的。因此所有引擎都可使用binlog.

两种日志的区别:

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

    update语句执行流程如下图,图中深色框是在执行器中执行,浅色框是在InnoDB中执行的:

《MySQL实站45讲学习笔记—02|日志系统:一条sql更新语句是怎么执行的》

 

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注