学习《MySQL实战45讲》丁奇--第二篇 | 日志系统:一条SQL更新语句是如何执行的?总结

1.为什么SQL查询不建议使用查询缓存?
    在一个表上有更新的时候,跟这个表有关的查询缓存会失效。
2.Mysql中WAL的概念是什么?
    WAL:Write-Ahead Logging,即先写日志,后写磁盘。
3.存储引擎InnoDB中的redo log(重做日志)?
        首先redo log是InnoDB特有的日志系统,用来记录对磁盘页中数据的变动。
        特点:redo log 是物理日志,大小固定,循环写入,当Mysql意外宕机后,记录好的redo log在Mysql重启后可根据redo log     中的记录继续向磁盘中写入数据,这个能力被称之为:crash-safe。
        redo log 有两个指针的概念,一个是check point,另一个是write pos,其中check point至write pos之间是需要擦除并写入磁盘中的数据记录,write pos至check point之间是可写入的存储空间大小。当write pos与check point重合后意味着,此时存储引擎需要暂停工作,将redo log中的记录写入磁盘,向后移动check point指针,而后继续工作。
       innodb_flush_log_at_trx_commit这个参数设置成 1 的时候,表示每次事务的 redo log都直接持久化到磁盘。这个参数建议设置成 1,这样可以保证MySQL 异常重启之后数据不丢失。
4.Mysql中的binlog(归档日志)?
        归档日志binlog是所有Mysql引擎通用的日志系统,用来记录更新逻辑,例:将id为2的数据行删除。
        特点:binlog 是逻辑日志,追加写入不会覆盖以前的日志。
        sync_binlog 这个参数设置成 1 的时候,表示每次事务的 binlog 都持久化到磁盘。这个参数建议设置成 1,这样可以保证     MySQL 异常重启之后 binlog成 1,这样可以保证 MySQL 异常重启之后 binlog不丢失。
5.一条sql更新语句执行的过程(以InnoDB为例)?
     例:将id为2的数据行中的c字段加1。
     1)首先执行器调用存储引擎提供的查询接口;
     2)存储引擎在内存中查找id为2的数据,找到直接返回给执行器,否则扫描磁盘将id为2的数据读入内存并返回给执行器;
     3)执行器将id为2的数据行中的c加1,调用存储引擎的更新接口,更新内存中id为2的数据;
     4)存储引擎将更新写入redo log,此时redo log处于prepare状态;
     5)执行器将更新逻辑写入binlog;
     6)存储引擎提交事务,此时redo log处于commit状态,完成更新操作,后续当存储引擎空闲时通过redo log更新磁盘数据。
6.为何InnoDB中redo log使用“两阶段提交”?
      之所以使用两阶段提交,目的是为了让binlog与redo log在逻辑上处于一致,这样当需要通过binlog做数据恢复时保证数据的一致性和正确性。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值