我發現與插入相同行數的多線程解決方案相比,按順序將數據插入我的數據庫非常慢。在我的順序方法中插入 50000 行大約需要 4 分鐘,而在并行版本中只需要大約 10 秒。我使用https://github.com/go-sql-driver/mysql驅動程序。對于數據庫,我剛剛使用了最新版本的 Windows 版 XAMPP,并使用 MySQL 數據庫及其標準配置。順序版本:for i := 0; i < 50000; i++ { _, err2 := db.Exec("insert into testtable (num, text1, text2) values (?, ?, ?)", i, "txt1", "txt2") if err2 != nil { fmt.Println(err2) }}并行版本:for i := 0; i < 50; i++ { wg.Add(1) go func() { defer wg.Done() for j := 0; j < 1000; j++ { _, err2 := db.Exec("insert into testtable (num, text1, text2) values (?, ?, ?)", 1, "txt1", "txt2") if err2 != nil { fmt.Println(err2) } } }()}為什么第一個版本比第二個版本慢?有任何想法嗎?我是否使用了錯誤的函數來插入數據?
1 回答

守候你守候我
TA貢獻1802條經驗 獲得超10個贊
運行一個有很多開銷INSERT
:
客戶端和服務器之間的通信。
解析
INSERT
打開表等。
獲取下一個
AUTO_INCREMENT
值。檢查沖突、死鎖等。
提交事務。
所有這些都在單個 CPU 中完成,如有必要,還需要等待 I/O。
你有 50 個線程;他們跑得快了 24 倍。
但是你可以做到 10 倍——一次將這些行分成INSERT
100 行。這消除了大部分開銷,尤其是提交。(超過 100-1000 行會導致收益遞減和其他開銷;所以停在那里。)
同時,使用的線程數不要超過你所擁有的 CPU 內核數的兩倍。否則,他們只會相互絆倒。這可能就是為什么 50 個線程的速度只有24 倍。
- 1 回答
- 0 關注
- 148 瀏覽
添加回答
舉報
0/150
提交
取消