![插入 12000 条记录时 MyISAM 吞吐量激增](https://linux22.com/image/656835/%E6%8F%92%E5%85%A5%2012000%20%E6%9D%A1%E8%AE%B0%E5%BD%95%E6%97%B6%20MyISAM%20%E5%90%9E%E5%90%90%E9%87%8F%E6%BF%80%E5%A2%9E.png)
我正在通过批量记录插入测试数据库性能。
除存储引擎外,两个系统完全相同
**Database 1000 4000 12000**
MySQL_InnoDB 60.95330976 218.2572161 262.1174723
MySQL_MyISAM 88.55827134 307.503075 684.8142441
这里的指标是吞吐量,定义为操作/秒。
如您所见,当插入 1000 条记录时,两者非常相似,同样为 4000 条。
我不确定为什么 MyISAM 在插入 12000 条记录时峰值会比 InnoDB 高。可能是因为缓冲区大小吗?我的默认值设置为 8MB,并且我发现 1000 条记录和 4000 条记录都在该缓冲区内,但 120000 条记录超过了 8MB 缓冲区大小。这可能是吞吐量呈指数级增长的原因吗?
我更感兴趣的是为什么 MyISAM 在 12000 次插入时每秒的操作数会出现如此指数级的激增,而 InnoDB 似乎更加线性。
答案1
使用 innodb 时,您可能会填充事务日志 ( innodb_log_size
)。插入时,InnoDB 首先将所有内容写入事务日志。一旦进入日志,事务就会应用于数据库本身。这样,如果服务器在事务中途崩溃,它可以重播日志(重新应用事务)以保持数据的一致性。
这实际上意味着,每个数据都会被写入磁盘两次。
如果插入的内容不适合日志,则必须等到日志中的事务刷新到数据库。这可能是您看到性能大幅提升的原因。
(哦,注意日志大小。如果日志太大,服务器崩溃后的恢复可能会花费很长时间)
答案2
增加池大小肯定会对 InnoDB 性能产生非常明显的影响。尝试将其增加到 128/256 MB,然后重试测试。
这里您可以找到更多信息。