一. 初步认识

binlog二进制日志
redolog
undolog

二. binlog

binlog记录写入行操作

作用

1)、主从复制:在Master端开启binlog,然后将binlog发送到各个Slave端,Slave端重放binlog从而达到主从数据一致。
2)、 数据恢复:通过使用mysqlbinlog工具来恢复数据。 binlog刷盘时机
对于InnoDB存储引擎而言,只有在事务提交时才会记录biglog,此时记录还在内存中,那么biglog是什么时候刷到磁盘中的呢?mysql通过sync_binlog参数控制biglog的刷盘时机,取值范围是0-N:
0:不去强制要求,由系统自行判断何时写入磁盘; 1:每次commit的时候都要将binlog写入磁盘;
N:每N个事务,才会将binlog写入磁盘。

三、RedoLog和UndoLog

BinLog是MySQL
Server层的日志,所有的MySQL存储引擎都支持BinLog。BinLog可以支持主从复制和数据恢复,但是对事务的ACID特性支持比较差。InnoDB存储引擎引入RedoLog和UndoLog事务日志,用于提升事务场景下的数据库性能。本文会对RedoLog和UndoLog进行介绍。

一条SQL经历的步骤select * from user_info where id = 1;

连接器:客户端和MySQL服务端建立连接,用户名密码等信息校验; 查询缓存:如果SQL语句是查询语句,则查看查询语句是否命中缓存;
分析器:对SQL语句的词法和语法进行分析,判断SQL语句的类型和对应的表等信息;
优化器:对SQL语句进行优化,选择合适的索引;
执行器:在对应的MySQL引擎上执行SQL查询语句,并返回查询结果;

update user_info set name='zs' where id=1;

和查询流程不一样的是,更新流程还涉及ChangeBuffer和两个重要的日志模块:BinLog和RedoLog。其中BinLog和ChangeBuffer的作用已经在前文中介绍过,BinLog用于主从复制和数据恢复,ChangeBuffer用于缓存对数据库中数据的操作,RedoLog则是本文介绍的主角了。

四、ChangeBuffer技术

对于上文中的更新语句,如果没有RedoLog,那么InnoDB引擎会按照索引查找到id=1的用户记录,把记录加载到内存中,然后修改内存中的数据事务提交后再写回磁盘。如果数据库数据更新的频率非常低,那么这样更新方式数据库也可以接受,但是在更新非常频繁的情况下,大量的离散IO会成为数据库的瓶颈,影响数据库的性能。

在更新频繁的场景下,如何降低磁盘的IO并保证事务呢?这就涉及到我们前边文章中介绍过的ChangeBuffer技术了,在满足ChangeBuffer缓存操作的条件下,InnoDB并不会立即把数据的变更操作写入磁盘,而是将这些对数据页的操作缓存到ChangeBuffer中,数据库找合适的机会再将操作Merge到数据库中。

通过ChangeBuffer技术,我们可以把对数据库的多次离散访问合并为一次数据库访问,并且用户的更新线程中不需要实际访问磁盘,大大提升了数据库性能。

RedoLog称为重做日志,每当有操作时,在数据变更之前将操作写入RedoLog,这样当发生掉电之类的情况时系统可以在重启后继续操作;
UndoLog称为撤销日志,当一些变更执行到一半无法完成时,可以根据撤销日志恢复到变更之间的状态;
MySQL的InnoDB引擎中就使用了WAL技术,所以InnoDB存储引擎包含了RedoLog和UndoLog两部分日志。