深度解析:在 MySQL 中 一条SQL更新语句是如何执行的?

WAL

  • 在 MySQL 中,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程IO成本、查找成本都很高。
  • 为了解决这个问题,MySQL 引入 WAL (Write-Ahead Logging)技术。它的关键点在于 先写日志,再写磁盘。而这就涉及到 MySQL 的两大日志模块:rede log 和 binlog
  • 当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log 里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做的。

redo log

  • InnoDB的 redo log 是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB,那么这块“粉板”总共就可以记录4GB的操作。从头开始写,写到末尾就又回到开头循环写,如下面这个图所示

  • write pos当前记录的位置,一边写一边后移,写到第3号文件末尾后就回到0号文件开头
  • checkpoints 是当前已经写入数据文件的位置,当 redo log 上面的记录被写入数据文件后,checkpoints 就可以往后移
  • write poscheckpoint 之间的是 redo log 上还空着的部分,可以用来记录新的操作
  • 如果 write pos 追上 checkpoint ,表示 redo log 被写满了,这时候不能再执行新的更新,得停下来先将一些记录写入数据文件,把 checkpoint 推进一下。
  • 有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 cras
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值