亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

MySQL 順序插入很慢,而線程插入很快 - 為什么?

MySQL 順序插入很慢,而線程插入很快 - 為什么?

Go
哆啦的時光機 2023-08-14 14:52:05
我發現與插入相同行數的多線程解決方案相比,按順序將數據插入數據庫的速度非常慢。在我的順序方法中插入 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 回答

?
一只名叫tom的貓

TA貢獻1906條經驗 獲得超3個贊

運行有很多開銷INSERT

  • 客戶端和服務器之間的通信。

  • 解析INSERT

  • 打開桌子等。

  • 獲取下一個AUTO_INCREMENT值。

  • 檢查是否有沖突、死鎖等。

  • 提交交易。

所有這些都在單個 CPU 中完成,并在必要時等待 I/O。

你有 50 個線程;他們跑的速度是原來的 24 倍。

INSERT但您可以做得更好 10 倍——一次將行批處理為100 行。這消除了很多開銷,尤其是提交。(超過 100-1000 行會導致收益遞減和其他開銷;所以到此為止。)

同時,使用的線程數不要超過 CPU 核心數的兩倍。否則,他們只會互相絆倒。這可能就是為什么 50 個線程的速度只有24 倍的原因。


查看完整回答
反對 回復 2023-08-14
  • 1 回答
  • 0 關注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號