mysql的各种名词
脏页:在内存中,页数据被修改则该数据页即时脏页,通过page clean thread 去刷新脏页到磁盘
undo :保存事务提交前的数据,方便回滚
redo log buffer:我们对数据的修改先写入redo log buffer,然后写入redo log file,事务未提交的也写入
redo log file:留作数据库宕机恢复,通过purge thread 回收
insertBuffer:我们mysql中的数据默认是按照主键进行顺序存储,同时我们还需要维护非主键索引与非主键索引的关系数据页(即非主键索引),通过该索引数据可以找到主键索引,进一步通过主键索引获取到数据记录。因此insertBuffer只能适用于辅助索引,且非唯一索引,因为插入主键是顺序存放,但是对于非聚集索引则可能离散存放,通过insertBuffer 可以合并多个操作为一个,提高效率(写入到insertBuffer是顺序写的所以性能不会下降很多)
double write:为了处理部分写失效,比如16KB的页只写了4KB然后宕机,而redo log 只是记录物理日志,比如偏移量和实际记录,但是因为页已经被污染,偏移量不准了,所以需要先把double write时候顺序写的内容中对应的页复制过来 然后在进行redo 操作
image.png
如果没有doubble write 我们正常写 都是从 内存写入到文件系统,然后文件系统写入到磁盘
因为redolog写入的单位就是512字节,也就是磁盘IO的最小单位,所以无所谓数据损坏。怀疑是因为其直接绕过文件系统,直接写入到磁盘(所以正好等于磁盘IO最小单位)

其实MySQL的Innodb以及Oracle数据库的redo log,不是记录纯物理的操作,而是物理和逻辑结合的日志。(这样可以减少redo的生成).也就是说redo log 是物理和逻辑结合的日志
物理到page,也就是page具体在硬盘上的具体位置。
后面对于page的操作,则是根据自己的格式逻辑存储的(应用的时候需要通过特定的解析函数),比如说向page里面插入一条记录。
write Ahead log:即在更新内存中的页时候会去写 redo log

- binlog 是属于 mysql的 redo log是属于innodb的,binlog属于逻辑日志,是逻辑操作。innodb redo属于物理日志(也包含逻辑),是物理变更。逻辑日志有个缺点是难以并行,而物理日志可以比较好的并行操作。
- binlog 只会记录不会覆盖 ,redo log 可以重复使用,其对应的是内存中的脏页。
- 二进制日志文件记录是关于一个事务的具体操作内容,即该日志是逻辑日志。而InnoDB存储引擎的重做日志是关于每个页(Page)的更改的物理情况。
-
写入的时间也不同。二进制日志文件仅在事务提交后进行写入,即只写磁盘一次,不论这时该事务多大。而在事务进行的过程中,却不断有重做日志条目(redo entry)被写入到重做日志文件中。
image.png
mysql的各种名词