刷盘策略
- Innodb在写Redo日志的时候,是先写入redo log buffer 中,然后再按照一定频率刷新到redo log file中。
- 这里的 一定频率 有多个选择,这些选择对应的就是不同的刷盘策略.
这里的刷盘不是指将内存中的数据刷新到磁盘,而是指从Redo日志位于内存中的缓冲区(redo log buffer)刷新到位于磁盘中的文件区(redo log file).
- redo log buffer 刷盘到redo log file的过程也不是真正刷到磁盘中去,只是刷入到 文件缓存系统(
page cache
)中去。真正的刷入磁盘会交给操作系统来决定
关键参数
数据库中innodb_flush_log_at_trx_commit
参数就控制了在事务提交时,如何将buffer中的日志数据刷新到file中.
该参数支持三种策略:
- 参数值为0:提交事务也不进行刷盘操作
- 参数值为1:提交事务一次就刷盘一次( 默认刷盘策略)
- 参数值为2:每次提交事务时,只会将buffer中的内容写入页面缓存中,不会在将页面缓存中的数据刷盘到file中。
查看默认的刷盘参数值:
mysql> show variables like 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1 |
+--------------------------------+-------+
1 row in set, 1 warning (0.03 sec)
可以看到参数值为1,即默认提交一次就刷盘一次
这里必须提到的一个情况是,即使我们将参数设为0,什么也不做,在数据库中也有一个后台线程,默认每1秒就帮我们自动刷盘一次:
没有提交的事务在执行过程中写下的redo log记录,也可能会被后台线程刷盘,如下图:
除了后台线程自动刷盘外,还有一种情况也会刷盘,就是当buffer中的记录数据大小达到最大值(16M
)的一半的时候,也会自动刷盘。
总结:
- 事务提交时会刷盘
- 后台线程每隔1秒自动刷盘
- 记录达到buffer空间一半时刷盘
不同刷盘策略演示
参数值为1时,提交一次刷盘一次
参数为2时,将buffer中的数据刷新到page cache中间缓存中,不会进一步更新到file中
我们分别对参数为1和参数为2时进行操作,看相同操作下哪个用掉的时间更短。
参数1演示
创建数据库
CREATE D