1.缓存池 Buffer Pool
数据是存放在磁盘中, 要更新一条数据,首先需要把这条数据加载到内存中,在内存中修改完后再写回磁盘,由于 磁盘的IO 读写比起 内存读写 很慢, 所以每修改一条数据进行一次IO 显然不行. 怎么办呢, InnoDB中 加了 缓存池 Buffer Pool , 把读取过的数据缓存起来.
修改数据的时候也是 先写入Buffer Pool ,然后再刷到磁盘中.多长时间刷一次? InnoDB 有一个专门刷盘的线程,每隔一段时间会将buffer Pool 中多个修改刷到磁盘.
BufferPool 的作用就是提高读写效率.
在刷盘前, 数据库宕机或重启, 那岂不是数据丢失了? Redo log 登场
InnoDB 把所有写入缓存的修改数据 同时会写入 Redo log 文件,Redo 保存在磁盘中.Mysql 重启后 根据Redo Log 文件进行数据恢复.
写Redo log 和 写数据到磁盘有啥区别?
既然写Redo log 也是把数据写到 磁盘 ,那为何不直接写入磁盘呢? 原因是写磁盘 首先要寻址, 因为我们需要的数据可能是分开存储在不同的扇区, 所以 ,可能会找到多个扇区 才能 把我们需要的数据找全, 这个过程也称作随机I/O.读取数据速度较慢.
而Redo log 文件是将所有的修改都写到一块, 不需要从磁盘中其他地方去重复找我们需要的数据, 所以写 Redo Log 又称顺序I/O .当服务重启后,只需要一次性将Redo Log 重新加载一次.
因此,使用 Redo log 在保证数据安全的同时也提升了系统效率.
![](https://img.haomeiwen.com/i21117986/de8ed0ea0f8e7314.png)
上图中 就是 Redo log . ib_logfire0 和 ib_logfire1 默认是两个, 一个48M.
Redo log 特点
1. redo log 是InnoDB 引擎实现的, 并不是所有引擎都有. 支持崩溃恢复时 InnoDB 引擎的一个特点.
2.redo log 不是记录数据也更新后的状态,而是记录数据更新内容,
3.redo log 大小时固定的,前面的内容会被覆盖, 一旦写满会 将buffer pool 刷到 磁盘中.腾出空间记录后面的修改.
提一下Undo log
那 undo log 又是什么? undo log 又称事务日志, 记录事务发生前数据的状态,主要用于事务回滚,数据恢复.保证了事务的原子性.
Redo log 和 Undo log 都和事务有关,所以又称 事务日志.
网友评论