2009-09-02 109 views
2

我試圖插入大約5億行垃圾數據到數據庫中進行測試。現在我有一個PHP腳本循環遍歷TRANSACTION中的幾個SELECT/INSERT語句 - 顯然這不是最好的解決方案。這些表是InnoDB(行級鎖定)。Fork MySQL INSERT INTO(InnoDB)

我想知道如果我(正確)分叉進程,這會加快INSERT進程嗎?按照它的速度,它將需要140小時才能完成。我擔心兩件事情:

  1. 如果INSERT語句必須獲取寫鎖,然後將它呈現分叉沒用,因爲多個進程不能同時寫入同一個表?

  2. 我使用SELECT...LAST_INSERT_ID()(在TRANSACTION內)。在數據庫中有多個進程INSERT時,此邏輯會中斷嗎?我可以爲每個叉創建一個新的數據庫連接,所以我希望這可以避免這個問題。

  3. 我應該使用多少個進程?查詢本身很簡單,我有一個2GB RAM的常規雙核開發盒。我將InnoDB設置爲使用8個線程(innodb_thread_concurrency=8),但我不確定是否應該使用8個進程,或者如果這是考慮匹配的正確方法。

感謝您的幫助!

回答

4

1)是的,會有鎖爭用,但innodb被設計爲處理多個線程試圖插入。當然,他們不會同時插入,但它會處理爲您插入序列化。只要確保你專門關閉你的交易,並儘快完成。這將確保您獲得最佳的插入性能。

2)否,如果每個線程有1個連接,則該邏輯不會中斷,因爲last_insert_id()是連接特定的。 3)這是你只需要進行基準測試就可以瞭解的其中一件事。實際上,我會讓程序自我調整。運行帶有8個線程的100個插入並記錄執行時間。然後再嘗試一半的次數和兩次。無論哪一個更快,然後在該數字附近對更多的線程計數值進行基準測試。

總體而言,您應該始終堅持以此爲基準來查看哪種方法更快。在你花時間考慮並寫出來的時候,你可能已經有了初步的數字。

+0

感謝您的詳細回覆!很高興知道沒有什麼值得關注的。 – ash 2009-09-02 16:35:17

7

有關插入大量記錄的MySQL文檔有a discussion。看起來明顯的勝利者是使用LOAD DATA INFILE命令,接着是插入多個值列表的插入。

+0

感謝您的提示!快20倍,優秀。 – ash 2009-09-02 16:34:31