MySQL: 插入性能 INNODB vs MYISAM

6
我正在向一个只有5个属性和1000行的简单小表中插入数据。
当引擎为INNODB时,我发现每次插入需要0.03-0.05秒。我将引擎更改为MYISAM后,插入速度变快了,只需要0.001-0.003秒。
问题出在哪里?innodb_flush_log_trx_commit默认设置为1,我没有更改这个设置。以下是我的innodb设置。
innodb_log_buffer_size : 1MB
innodb_log_file_size   : 5MB
innodb_buffer_pool_size: 8MB
innodb_flush_log_trx_commit = 1

我无法弄清楚出了什么问题。 预先感谢。 敬礼, UDAY


你应该尝试在http://dba.stackexchange.com/或http://serverfault.com上发布此内容。 - Mike Purcell
2
InnoDB刷新方法似乎是问题的原因之一。通过将刷新方法更改为O_DIRECT / O_DSYNC,我获得了5倍更好的性能。 - Uday
1个回答

3

innodb_flush_log_at_trx_commit = 1 表示每个事务都会被写入日志缓冲区。

将其设置为0可以获得更好的性能,甚至可以尝试在一个事务中执行所有插入操作(不要忘记在最后提交)。

您可以查看http://dev.mysql.com/doc/refman/4.1/en/innodb-parameters.html以获取有关innodb_flush_log_at_trx_commit和其他变量的更多详细信息。


嗨Argeman,我关心的是为什么将这个变量设置为1时,它显示非常非常低的吞吐量,例如每小时120K插入。除了将该值更改为2之外,这个值设置为1会导致性能更差的原因是什么。 - Uday
你是真的认为在普通服务器上单个事务需要10-50毫秒吗?我不这么认为。没有人能接受这样的速度。我只在一些服务器上遇到了这种性能问题,而不是所有服务器。 - Uday
这个问题不仅限于MySQL,每个想要永久存储事务的程序都会有这种行为。否则,事务可能会结束,但没有保存到磁盘上!而且请记住,您可以将尽可能多的命令打包到单个事务中,因此可以轻松避免此问题。当然,您也可以使用更好的硬件或只需切换到O_DIRECT/O_DSYNC标志... - Argeman
我将其设置为2,性能类似于使用MYISAM引擎时所看到的。但我希望在将其设置为2时获得同样更好的性能。 - Uday
"innodb_flush_log_at_trx_commit = 0" 相较于默认值1,使我的插入性能提高了一倍。 - Shawn Guo
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接