2012-11-07 78 views
2

我有一個數據庫表,有成千上萬的行。輸入新行或更新行需要一點時間。要執行50次更新(格式爲update table set field = 1234 where id = 5678; update table set field = 912 where id = 582; ...),可能需要4或5秒鐘。innoDB - 我應該關閉innodb_flush_log_at_trx_commit嗎?

我該如何減少這段時間?值得使用innodb_flush_log_at_trx_commit設置嗎?我如何才能爲某些連接/查詢設置該設置?

innodb_flush_log_at_trx_commit一起玩可以安全嗎?數據並不重要,只要一個副本(或者在UPDATE命令之前或之後)完成(它只是設置一些稍微隨機的數據更新...在這些查詢中沒有重要數據被改變)

這個表上的大部分查詢都是SELECT,所以這就是我使用innodb的原因。

感謝

回答

3

是的,它是安全的改變的innodb_flush_log_at_trx_commit。將其從1(默認值)更改爲0或2的效果是,日誌寫入將每秒發生一次,而不是每次提交一次。換句話說,現在你的50個更新導致了50個fsyncs(假設你正在使用自動提交)。您可以將其更改爲每秒1 fsync。

但你也可以得到利用自動提交,而是包裹在一個明確的事務的50個更新類似的效果:

  1. 開始事務,暫時禁用autocomit。
  2. 運行50個更新。
  3. 提交。

這將在提交時導致1個fsync(加上每秒1個fsync,無論配置如何,總是完成)。這可能足以提高吞吐量。所有這些說,我不認爲50 fsyncs需要5秒在任何系統上,除非你有非常蹩腳的硬盤驅動器或服務器也加載了很多其他流量。

您還應該確保更新受益於索引。我可以假設id是表的主鍵,因此它是聚集索引。但我想確認一下。你可以運行SHOW CREATE TABLE <tablename>並在上面的問題編輯中發佈輸出?

+0

當這個事務正在完成時,這會影響讀取嗎? (順便說一下,表中有100,000行,我認爲改變這些值需要很長的時間,因爲它的索引很大,它幾乎是一個非唯一的索引(可能任何時候5%都是重複的值),id是主鍵。它的一些索引,但唯一一個'id'是「PRIMARY KEY('id'),」 – slycat

+0

它不應該影響讀取,但它取決於很多其他因素,比如你的服務器配置使用和在同一臺服務器上同時運行的其他工作。 –

相關問題