2011-04-08 23 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