mysql log buffer,第32问:innodb_log_buffer_size 到底有什么作用?

问题:

MySQL 官方文档说 innodb_log_buffer_size 是 redo log 的写缓存,设置大一点能减少写操作。

我们用实验来学习一下这个参数的作用。

实验:

宽油起个数据库:

5f9cc4e27c9f5176a9890aa8c4dddb2f.png

先将 innodb_log_buffer_size 设置为最小值。

接下来,我们先建一个有数据的表,建表的方法参考实验 11:

a606151441454bf8aec15d24e519e26d.png

重复执行最后一句 insert,直到表中有 65536 行数据:

9efab6598119dd64746c479ad673ded5.png

接下来我们复制一张表,因为我们要做两次实验:

4318eeb5f0b92ed1f8f1b795b80a7dd3.png

接下来我们开启 innodb metrics 和 performance_schema:

6656bbb311a46bdd7b3706ec2336ab8d.png

执行一次 insert,计算一下 LSN 的差值,也就是这个事务产生了多少 redo log:

3f72fbed1f31f1f3879a650e6d459c8a.png

可以看到这个事务大概产生了 3M 左右的 redo log。

再看一下这个过程发生了多少 IO:

93c2b8692f2f668d1c9105ce1c2efaf4.png

可以看到发生了 7 次 IO,6 次 write 和 1 次 sync,每次 write 大概需要 0.8ms。

现在我们变更一下 my.cnf,将 innodb_log_buffer_size 变更为默认值 16777216,重启数据库。此处省略步骤, 只看结果:

5ecad7e414debfeae47b0a96bc956cb1.png

由于重启了一次数据库,记得再开启一次 innodb metrics 和 performance_schema:

428b33ccacc47d52cc7a4ae22a1adca3.png

再执行一次 insert,计算一下 LSN 的差值, 不过这次用的是 t2 表:

7a3af61069baf3f3ae38905bedea8f48.png

也产生了 3M 左右的 redo log。

再来看看 IO:

2fcce773f51e6d052439ed21a7630306.png

这次只发生了 2 次 IO,一次 write 和一次 sync。

结论:

对比一下两次 IO 的结果,可以看到:

innodb_log_buffer_size 是 redo log 的写缓存,如果 buffer 不够大,就会发生多次 IO write,将缓存中的数据刷到磁盘;

innodb_log_buffer_size 越大,IO 次数越少。

在我的虚拟机环境的一般存储上,虽然 IO write 次数少了,但 write 的数据量是差不多的,所以整体的 IO 延迟总体差不多;在好点的存储上,如果数据量差不多, write 次数越少,延迟会越低。

这也就是为什么大家在调整这个参数后, 经常会感知不到性能的提升。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值