[英]Fork MySQL INSERT INTO (InnoDB)
我正在嘗試將大約5億行垃圾數據插入數據庫進行測試。 現在我有一個PHP腳本循環遍歷TRANSACTION
的一些SELECT/INSERT
語句 - 顯然這不是最好的解決方案。 表是InnoDB(行級鎖定)。
我想知道我是否(正確)分叉過程,這會加速INSERT
進程嗎? 按照它的速度,需要140個小時才能完成。 我關心兩件事:
如果INSERT
語句必須獲取寫鎖定,那么它會使forking無用,因為多個進程不能同時寫入同一個表嗎?
我正在使用SELECT...LAST_INSERT_ID()
(在TRANSACTION
)。 當多個進程INSERT
數據庫時,這個邏輯是否會中斷? 我可以為每個fork創建一個新的數據庫連接,所以我希望這可以避免這個問題。
我應該使用多少個進程? 查詢本身很簡單,我有一個帶2GB RAM的常規雙核開發盒。 我設置我的InnoDB使用8個線程( innodb_thread_concurrency=8
),但我不確定我是否應該使用8個進程,或者這是否是考慮匹配的正確方法。
謝謝你的幫助!
MySQL文檔討論了有效插入大量記錄的問題。 似乎明顯的贏家是使用LOAD DATA INFILE命令,然后是插入多個值列表的插入。
1)是的,會有鎖爭用,但innodb旨在處理多個嘗試插入的線程。 當然,它們不會同時插入,但它會為您處理插入序列化。 只是確保你專門關閉你的交易,你盡快完成。 這將確保您獲得最佳的插入性能。
2)不,如果每個線程有1個連接,則此邏輯不會中斷,因為last_insert_id()是特定於連接的。
3)這是你需要進行基准測試才能弄清楚的事情之一。 實際上,我會讓程序自我調整。 運行100個插入8個線程並記錄執行時間。 然后再嘗試一半和兩倍多。 無論哪一個更快,然后在該數字周圍標記更多的線程計數值。
總的來說,你應該始終只是繼續對這種東西進行基准測試,看看哪種更快。 在您考慮並編寫它的時間量上,您可能已經有了初步數字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.