MySQL~Redo刷盘策略、LogBuffer缓存池和LogFile日志文件理解

刷盘策略
  • 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
MySQL 的 InnoDB 存储引擎中有两个非常重要的概念:Buffer Pool Redo Log。下面我们分别对 Buffer Pool 参数设置以及 Redo Log 进行简单介绍。 ### 一、Buffer Pool 参数设置 #### 1. **什么是 Buffer Pool** Buffer Pool 是 InnoDB 中用于缓存数据页索引页的内存区域。通过将经常访问的数据存储到 Buffer Pool 中,可以减少磁 I/O 操作,从而提升查询性能。 #### 2. **关键参数配置** 以下是常用的 Buffer Pool 相关参数及其作用: - `innodb_buffer_pool_size`: 设置 Buffer Pool 的大小,默认值通常较小,在生产环境中应根据服务器可用内存合理调整。例如,若数据库是主应用,则建议将其设为物理内存的 50%-70%。 - `innodb_buffer_pool_instances`: 将 Buffer Pool 分成多少个实例(默认8)。增加该值有助于避免线程竞争问题,特别是在高并发场景下推荐适当增大此数值。 - `innodb_old_blocks_pct` `innodb_old_blocks_time`: 控制 LRU 列表中新旧块的比例及时长等细节。 #### 配置示例 ```sql -- 设定缓冲池大小为4GB,并分为4个实例运行 SET GLOBAL innodb_buffer_pool_size = 4*1024*1024*1024; SET GLOBAL innodb_buffer_pool_instances = 4; ``` --- ### 二、Redo Log 原理及管理 #### 1. **什么是 Redo Log** Redo Log 记录了所有事务对数据所做的更改操作日志信息,主要用于保证事务持久性崩溃恢复功能。当发生系统故障时,未同步至磁的数据可通过重做这些日志得以还原。 #### 2. **相关重要参数** - `innodb_log_file_size`: 单个 redo log 文件尺寸,默认通常是64MB~4GB之间视工作负载而变化;较大的文件能降低脏频率但也延长启动时间。 - `innodb_flush_log_at_trx_commit`: 决定了每次提交后是否立即将redo记录写入并fsync硬上。其取值有三种情况: - 0 表明每秒才新一次; - 1 (也是默认)意味着立刻保存到磁里最安全; - 2 允许先放在OS cache里再定时flush出去。 举个例子来说就是如果追求速度的话可以选择模式“0”但是风险会相应提高一点因为万一断电可能会丢失一秒内的变更内容。 --- ### 总结 理解 MySQLBuffer Pool Redo Log 的工作机制对于优化数据库性能至关重要。通过恰当调整上述提到的各种选项能够更好地满足实际业务需求下的读写效率要求!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值