redo log的用处
redo log用途
1. 用途
保证数据的更新操作不丢失,同时保证了性能
2. 如何没有redo log,如何保证数据库的更新操作不会由于数据库的宕机而丢失?
对数据库进行修改,应该是先从磁盘读取数据到内存中,然后在内存中对数据进行修改,然后再将数据写入到磁盘中,这样才能数据库
才能返回数据修改成功
按照数据库处理流程来说,首先应该是通过连接器接收到一条SQL语句,然后解析器对这条SQL进行词法解析,然后由优化器生成一个
执行计划,接下来就交由执行器来执行这个计划,执行器将会调用引擎接口从而实现更新操作
这里就存在一个问题,内存中不存在要修改的数据所在的数据页,此时就要将该数据页从磁盘中读取出来,然后修改完成之后,为了防止
数据库奔溃,就需要将数据写入磁盘中,从这个角度来看,一次数据库的更新操作,就要操作两次磁盘了
3. 如何使用redo log来保证更新操作的不丢失?
数据修改成功之后,就需要将该数据页刷到磁盘中去,以防丢失,但是现在已经引入了redo log,此时只需要这个修改信息写入到redo log当中,也就是将哪个数据页哪里发生了修改写入到redo log当中,而不需要将修改过的整个数据页刷到磁盘当中去
4. 写redo log同样也是一次磁盘的写操作,凭什么说它的性能就更高一点呢?
写redo log还有刷数据页到磁盘中去,都是磁盘的的写操作,但是呢,将修改信息写入到redo log当中,只需要数据顺序写入redo log
当中,这里其实就是一次顺序写磁盘的操作.
而将数据页刷到磁盘中,因为一个修改操作可能会同时修改多个数据页,这些数据页又不是连续的,此时就意味着随机写磁盘
并且,对于MySQL来说,一个数据页是16kb,可能一次性更新多个数据页,此时可能需要随机写入几百k的数据
而对于redo log,一次修改可能只需要写入几k的数据,数据量相对于刷数据页的方式是大大减少的
比较一下写redo log和刷数据页,写redo log是磁盘的顺序写,小数据量,而刷数据页到磁盘可能就意味着随机写,而且还是
大数据量的,两者一比较,写redo log的性能可能比刷数据页的性能高100倍