2012-12-20 25 views
5

我有一個約64個子進程的並行進程,每個子進程都需要將數據插入到登陸表中。我目前使用MySQL MyISAM引擎,並且在插入之前和之後禁用鍵。將數據並行插入MySQL的更快方法

但是,這似乎是我的過程中的一個巨大瓶頸。我相信每個插入MySQL都是表鎖,所以進程一直在等待寫入。

插入是獨立的,沒有衝突插入的危險。這也不需要交易或任何此類性質。

是否有不同的引擎或方法來提高MySQL的插入/寫入性能?

我曾經想過實例化一個表中的每個過程,但是這會使代碼更復雜,那不是我的風格....

任何建議,將不勝感激。

謝謝!

回答

4

由於INSERT DELAYED Syntax下記載:

DELAYED選項爲INSERT語句是一個MySQL擴展到標準SQL,如果您的客戶端不能或不必等待INSERT來完成,這是非常有用的。

[ deletia ]

使用INSERT DELAYED的另一個主要好處是從很多客戶插入被捆綁在一起,並寫在一個塊。這比執行許多單獨的插入要快得多。

+0

是的,我在想這個,但我擔心的是處理機器和服務器是同一臺機器。當使用Insert Delayed時,MySQL究竟在哪裏保存數據? RAM,SWAP,磁盤?我已經非常接近RAM限制已經與處理兒童... 謝謝! – user1459544

+1

@ user1459544:「排隊的行只保存在內存中,直到它們被插入到表中。」 - 當然,O/S將根據需要交換到虛擬內存 - 但如果內存不足,這可能值得投資一些。 – eggyal

+0

我認爲在256GB的這臺機器是挖掘,但讓我們一起去,我會讓你知道它是如何結果。也許如果它可以更快地進入數據庫,我的孩子們將會更快地釋放他們的RAM資源,併爲所有人帶來好時光。 – user1459544

2

MyISAM確實在插入,更新或刪除時鎖定表。 InnoDB允許事務和基於行的鎖定。

您還可以查看LOAD DATA INFILE,這對於批量插入更快。

+1

InnoDB仍然會執行下一行鎖定,其他插入的釋放將不得不等待。可悲的是'LOAD DATA INFILE'在這裏也沒什麼用處,因爲沒有「批量插入」,而是來自不同客戶端的大量單獨插入。 – eggyal

+0

我可以將插入管道插入文本,甚至可以使用cat來創建單個大文件,但這不是最佳IMO,因爲它會添加更多層處理。我可以用它作爲最後的手段,但我希望有些東西可以用MySQL來調整,以避免額外的步驟......或讓64個孩子試圖同時寫出... – user1459544

+0

也許你可以爲每個進程創建表和一旦所有孩子都完成了,合併到主表中? – snurre

相關問題