![](https://img.haomeiwen.com/i6561209/678189d3b188f4d0.png)
问题:
MySQL 官方文档说 innodb_log_buffer_size 是 redo log 的写缓存,设置大一点能减少写操作。
我们用实验来学习一下这个参数的作用。
实验:
宽油起个数据库:
![](https://img.haomeiwen.com/i6561209/19ea9ad71026f597.png)
先将 innodb_log_buffer_size 设置为最小值。
接下来,我们先建一个有数据的表,建表的方法参考实验 11:
![](https://img.haomeiwen.com/i6561209/980be5367e1406df.png)
重复执行最后一句 insert,直到表中有 65536 行数据:
![](https://img.haomeiwen.com/i6561209/af2cb402c30e87b7.png)
接下来我们复制一张表,因为我们要做两次实验:
![](https://img.haomeiwen.com/i6561209/b0ac907e261df27b.png)
接下来我们开启 innodb metrics 和 performance_schema:
![](https://img.haomeiwen.com/i6561209/4cc12f14c0893010.png)
执行一次 insert,计算一下 LSN 的差值,也就是这个事务产生了多少 redo log:
![](https://img.haomeiwen.com/i6561209/7a03ed3ea4eeca47.png)
可以看到这个事务大概产生了 3M 左右的 redo log。
再看一下这个过程发生了多少 IO:
![](https://img.haomeiwen.com/i6561209/4dd38dc4c8f33d69.png)
可以看到发生了 7 次 IO,6 次 write 和 1 次 sync,每次 write 大概需要 0.8ms。
现在我们变更一下 my.cnf,将 innodb_log_buffer_size 变更为默认值 16777216,重启数据库。此处省略步骤, 只看结果:
![](https://img.haomeiwen.com/i6561209/bbf83385bc2fc2ad.png)
由于重启了一次数据库,记得再开启一次 innodb metrics 和 performance_schema:
![](https://img.haomeiwen.com/i6561209/24a4dbb43519bc99.png)
再执行一次 insert,计算一下 LSN 的差值, 不过这次用的是 t2 表:
![](https://img.haomeiwen.com/i6561209/4a622d93e890ef84.png)
也产生了 3M 左右的 redo log。
再来看看 IO:
![](https://img.haomeiwen.com/i6561209/2287cde11f99e141.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 次数越少,延迟会越低。
这也就是为什么大家在调整这个参数后, 经常会感知不到性能的提升。
关于 MySQL 的技术内容,你们还有什么想知道的吗?赶紧留言告诉小编吧!
![](https://img.haomeiwen.com/i6561209/99f6b200cbf5ad4f.png)
网友评论