执行语句
update T set c=c+1 where ID=2;
redo log(重做日志)
作用:
1.提高写入性能;
2.实现事务的一致性(两阶段提交)。
MySQL里经常说到的 WAL 技术,WAL 的全称是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘。
本人最开始这里理解,日志就是缓存,其实不然。日志也是文件,虽然redo log有redo log buffer,但是这里是持久化的文件写入。
那么问题来了,都是io操作,都写入了,如何提升性能的呢?
主要点在于写入磁盘这个操作。即一个update写入磁盘的操作是相当复杂的,就拿其中的索引更新,由于是B+树索引,相对其他的结构,新增和删除操作,时间复杂度很高,需要根据不同的算法对索引进行旋转和拆分。
所以一个update过来,MySQL只是对其记下来,后续的一系列操作稍后一起做,这样就极大的提高了写入性能。
binlog(归档日志)
实名二进制日志(binary log),记录了对MySQL数据库执行更改的所有操作,但是不包括SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改。然后,若操作本身没有导致数据库发生变化,那么该操作可能也会写入二进制日志。
二进制日志主要有以下几种作用:
1.恢复(recovery):某些数据的恢复需要二进制日志,例如,在一个数据库全备文件恢复后,用户可以通过二进制日志进行point-in-time的恢复。
2.复制(replication):其原理与恢复类似,通过复制和执行二进制日志使一台远程的MySQL数据库(一般称为slave或standby)与一台MySQL数据库(一般称为master或primary)进行实时同步。
3.审计(audit):用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入的攻击。
redo log与binlog的不同点:
1.redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
2.redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
3.redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
两阶段提交:
目的就是让这两个状态保持逻辑上的一致。ACID的“C”。
后续写redo log和binlog的缓存。
上述内容林晓斌老师“MySQL实战45讲”的笔记,有兴趣的同学可以看下。
https://time.geekbang.org/column/article/68319
原文:https://www.cnblogs.com/lanbitou-java/p/13618626.html