首页 日志系统:一条SQL更新语句是如何执行的?
文章
取消

日志系统:一条SQL更新语句是如何执行的?

MySQL 的数据以数据页为单位,按偏移量寻找记录的具体位置,所以每次IO操作都是一个个数据页加载到内存。 但是我们需要查询或修改的数据也许就是一条记录,甚至对于更新操作,又会将数据页整个的刷新到磁盘,所以IO成本非常高,因而为了降低 IO 操作的成本,MySQL 做了大量的努力。

更新操作牵涉两个重要的日志:redo log 和 binlog

redo log 怎么起作用的

redo log 可以简单分为两个部分

  • 内存层面的 redo log buffer
  • 持久化层面的 redo log file

redo log实现的具体逻辑:

redo log如何起作用

write pos 和 check point

write pos 是 redo log 追加日志的索引,check point 代表擦除记录的位置,write pos 代表当前写的位置,当 write pos = check point 时,代表剩余空间已经被写完了,需要将 write pos 向前推进,擦除 redo log 中的一部分,并将这部分操作刷新到磁盘中,这样就形成了一个循环队列的数据结构,具体的形象图如下:

write pos 和 check point

binlog和redo log的区别

  1. redo log 是 InnoDB 独有的,而 binlog 是 server 层的,所有的引擎都可以使用
  2. 在更新事务期间,redo log 会循环不断记录,而 binlog 会在事务提交时一次性写入
  3. binlog记录的是原始逻辑,也就是把 SQL 语句直接存入,redo log 则是物理日志
  4. redo log 空间固定,binlog 可追加写,写完一个,会继续写另一个,这就说明 binlog 可以用来恢复临时库,因为里面记录任意时刻的原始操作

binlog的工作逻辑

通常备份库里会备份近半个月的 binlog,用于恢复临时库,当然如果想要数据库恢复更久之前的状态,也可以备份更长的甚至是一年的 binlog

本文由作者按照 CC BY 4.0 进行授权

基础架构:一条SQL查询语句是如何执行的

深入浅出索引