2011-04-08 24 views
1

我有一个约200万行的MySQL表和一个每秒更新大约100行的脚本。我想减少正在进行的磁盘写入I/O的数量。对于这个特定的表,ACID并不重要,因为如果我在崩溃中丢失了一些行,脚本就会在适当的位置恢复。即使我失去了过去一小时的工作,也没有什么大不了的。减少在MySQL中写入非关键数据的I/O?

该表使用的是InnoDB,但我切换到了MyISAM,因为我想如果它没有记录每个可以将I/O减少一半的写入。

但即使使用MyISAM,也有很多写入I/O正在进行。表+索引在磁盘上占用大约1300 MB,但MySQL每小时​​写入大约1600 MB到磁盘。我已经计算出,如果每行可以高效写入磁盘,那么每小时写入大约160 MB。所以它写的数据量是它需要的10倍。我意识到有一些低效率,但我猜测大部分写入是因为它将整个页面写入磁盘。

有什么办法可以减少它的写入次数,因此它会一直等到每个页面上的更多行被更新,以便它可以在写入时更加高效(即使在发生某个事件时会丢失更多的数据崩溃)?

回答

2

如果您使用的是innodb,例如您可以将innodb_flush_log_at_trx_commit设置为2。这极大地改进了我们系统更新期间的I/O。

这里澄清一些关于设置: http://www.mysqlperformanceblog.com/?s=innodb_flush_log_at_trx_commit

+0

也值得一看http://www.mysqlperformanceblog.com/2011/03/18/video-the-innodb-storage-engine-for-mysql/ – 2011-04-08 17:22:29

+0

我试过了 - 可以更改为等待超过一秒钟来刷新? – Nick 2011-04-12 17:49:33

+0

据我所知,它不能配置为等待超过一秒钟。 但你也可以使用冲洗方法。看看参数,并在你的一些测试系统上试用它们http://dev.mysql.com/doc/refman/5.1/de/innodb-parameters.html – csupnig 2011-04-13 13:17:54