日志系统:一条SQL更新语句是如何执行的?
1.update T set c=c+1 where ID=2;的执行过程
建立连接进行权限验证然后进入由于是更新语句就会使该表中的查询缓存失效,之后分析器进行词法分析以及语法更新,优化器进行索引的选择之后直接通过执行器进行执行并调用存储引擎的接口最后更新成功。更新的流程涉及到了两个重要的日志模块(redo log重做日志,binlog归档日志),
2.redo log(重做日志)
1.在MySQL里存在一个问题,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录进行更新操作,整个过程的IO成本,查找成本都很高,为了解决这个问题mysql使用WAL(Write-Ahead Logging)技术,它的关键点就是先写日志,再写磁盘。
2.具体的例子是:当有一条记录需要更新的时候,InnoDB引擎就会把记录写在redo log中,并更新内存,这个时候更新就算完成了,同时InnoDB引擎会在适当的时候将记录更新到磁盘中去,但是一般是在系统比较空闲的时候进行的。
3.InnoDB中的redo log是固定的大小,比如可以配置为一组4个文件,每个文件的大小都是1GB,那么总共可以记录4GB的操作,具体如下图所示。
3.有了redo log之后,InnoDB就可以保证数据库异常重启之后数据不会丢失,这个能力称之为crash-safe。
参考引用:Mysql实现(极客时间),侵删!