簡體   English   中英

Fork MySQL INSERT INTO(InnoDB)

[英]Fork MySQL INSERT INTO (InnoDB)

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

我想知道我是否(正確)分叉過程,這會加速INSERT進程嗎? 按照它的速度,需要140個小時才能完成。 我關心兩件事:

  1. 如果INSERT語句必須獲取寫鎖定,那么它會使forking無用,因為多個進程不能同時寫入同一個表嗎?

  2. 我正在使用SELECT...LAST_INSERT_ID() (在TRANSACTION )。 當多個進程INSERT數據庫時,這個邏輯是否會中斷? 我可以為每個fork創建一個新的數據庫連接,所以我希望這可以避免這個問題。

  3. 我應該使用多少個進程? 查詢本身很簡單,我有一個帶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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM