问题:
MySQL 官网文档说 innodb_log_buffer_size 是 redo log 的写缓存,设置大一点能缩小写操作。
咱们用试验来学习一下这个参数的作用。
试验:
宽油起个数据库:
先将 innodb_log_buffer_size 设置为最小值。
接下来,咱们先建一个有数据的表,建表的办法参考试验 11:
反复执行最初一句 insert,直到表中有 65536 行数据:
接下来咱们复制一张表,因为咱们要做两次试验:
接下来咱们开启 innodb metrics 和 performance_schema:
执行一次 insert,计算一下 LSN 的差值,也就是这个事务产生了多少 redo log:
能够看到这个事务大略产生了 3M 左右的 redo log。
再看一下这个过程产生了多少 IO:
能够看到产生了 7 次 IO,6 次 write 和 1 次 sync,每次 write 大略须要 0.8ms。
当初咱们变更一下 my.cnf,将 innodb_log_buffer_size 变更为默认值 16777216,重启数据库。此处省略步骤, 只看后果:
因为重启了一次数据库,记得再开启一次 innodb metrics 和 performance_schema:
再执行一次 insert,计算一下 LSN 的差值, 不过这次用的是 t2 表:
也产生了 3M 左右的 redo log。
再来看看 IO:
这次只产生了 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 的技术内容,你们还有什么想晓得的吗?连忙留言通知小编吧!