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

207 阅读1分钟

重要的日志模块: redo log


如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程IO成本、查找成本都很高。为了解决这个问题,MySQL 的设计者就用了。

  • 用到了WAL技术,关键就是先写日志,再写磁盘。
  • 具体来说,当有一条记录需要更新的时候,InnoDB引擎就会先把记录写到 redo log里面,并更新内存,这个时候更新就算完成了;同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做,这就像打烊以后掌柜做的事
  • InnoDB redo log 是固定大小的,比如可以配置为一组4个文件。

binlog

server 层日志 这两种日志有三点不同:

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

为什么要有两阶段提交?

  • 是为了两份日志之间的逻辑一致。