一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。一条更新语句的执行流程是什么样的?
MySQL 可以恢复到半个月内任意一秒的状态,这是怎么做到的?
可以从一个表的更新语句说起,比如:
create table T(ID int primary, c int);update T set c = c + 1 where ID = 2;
查询语句那一条流程,更新语句也是会同样走一遍。
和查询不同的是,更新流程会涉及到两个重要的日志模块:redo log(重做日志)和 bin log(归档日志)。
redo log
如果每一次更新操作都需要写入磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程的 IO 成本、查找成本都很高。为了解决这个问题,MySQL 就采用的 WAL 技术,关键点就是先写日志,再写磁盘。
具体来说就是,当有一条记录需要更新时,InnoDB 就会先把记录写到 redo log 里面,并更新内存,这个时候就算更新成功。同时,存储引擎会在合适的时候,将这个操作记录更新到磁盘,这个更新是在系统比较空闲的时候做。
有了redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,即 crash-safe。
bin log
redo log 是 InnoDB 引擎独有的日志,而serve 层有自己的日志,称为 binlog 日志。
