2009-11-21 29 views
1

我正在使用高速率數據流並執行以下步驟將數據存儲在MySQL數據庫中。對於每個新到的項目。優化MySQL插入來處理數據流

  • (1)解析傳入的項目。
  • (2)執行幾個 「INSERT ... ON DUPLICATE KEY UPDATE」

我已經使用INSERT ... ON DUPLICATE KEY UPDATE消除一個額外的往返到數據庫。

同時努力提高整體性能,我認爲做大量更新方式如下:

  • (1)解析傳入項目。 (2)用「INSERT ... ON DUPLICATE KEY UPDATE」生成SQL語句並追加到文件中。

定期將文件中的SQL語句刷新到數據庫中。

兩個問題:

  • (1)將這個在數據庫負載產生積極的影響?
  • (2)我應該如何將語句刷新到數據庫,以便在完全刷新後才重建索引? (使用交易?)

更新:我使用Perl DBI + MySQL MyISAM。

在此先感謝您的任何意見。

回答

1

您不說什麼類型的數據庫訪問環境(PERL DBI?JDBC?ODBC?)或者您正在使用哪種表存儲引擎(MyISAM?InnoDB?)。

首先,您是正確的選擇INSERT ... ON DUPLICATE KEY UPDATE。好的舉動,除非你能保證唯一的鑰匙。其次,如果你的數據庫訪問環境允許,你應該使用預準備語句。如果將一堆語句寫入文件中,然後再讓數據庫客戶端再次讀取該文件,那麼您肯定不會獲得良好的性能。直接從消耗傳入數據流的軟件包執行INSERT操作。

第三,選擇合適的表格存儲引擎。 MyISAM插入將比InnoDB更快,所以如果你記錄數據並在稍後檢索,這將是一個勝利。但InnoDB具有更好的事務完整性。如果您真的在處理噸位數據,而且您不需要經常閱讀,請考慮ARCHIVE存儲引擎。

最後,考慮在一批INSERT命令的開始處執行START TRANSACTION,然後在固定數量的行(例如100左右)之後執行COMMIT和另一個START TRANSACTION。如果你使用的是InnoDB,這會加速很多事情。如果您使用的是MyISAM或ARCHIVE,則無關緊要。

您的大勝將來自準備好的聲明內容和存儲引擎的最佳選擇。

+0

謝謝。我已更新原始帖子,以表明我在MyISAM存儲引擎中使用了Perl DBI。我的目標之一是加速傳入項目的初始處理,因爲我們由於緩慢而丟失了一些項目。 – ssn 2009-11-21 12:13:40

+0

只是澄清 - 你說與MyISAM表使用交易是無關緊要的?那麼,在這種情況下,沒有技術可以加速數百萬項目的批量插入? – ssn 2009-11-21 12:15:38

+0

正確。 MyISAM不提供事務鎖定或完整性。但結果是速度更快。 – 2009-11-22 21:44:34

3

如果您的數據不需要立即進入數據庫,您可以在某處緩存插入數據,然後發出一個較大的插入語句,例如,

在重複更新...上插入到table_name(x,y,z)值(x1,y1,z1),(x2,y2,z2),...(xN,yN,zN)

要清楚,我會保留一個未決插入列表。在這種情況下,列出(x,z,y)三元組。然後,一旦你的列表超過了某個閾值(N),你就會生成插入語句併發布它。

我沒有準確的時間數據給你,但與單獨插入每行相比,這種性能提高了大約10倍。

我也沒有玩過N的價值,但我發現1000很好地工作。我期望最佳值受硬件和數據庫設置的影響。

希望這有助於(我也使用MyIsam)。

+0

我也認爲這種方法比上面的答案中提到的更好 – Humoyun 2016-03-28 12:17:26