第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

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

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

Go
哆啦的時(shí)光機(jī) 2023-08-14 14:52:05
我發(fā)現(xiàn)與插入相同行數(shù)的多線程解決方案相比,按順序?qū)?shù)據(jù)插入數(shù)據(jù)庫(kù)的速度非常慢。在我的順序方法中插入 50000 行大約需要 4 分鐘,而并行版本只需要大約 10 秒。我使用https://github.com/go-sql-driver/mysql驅(qū)動(dòng)程序。對(duì)于數(shù)據(jù)庫(kù),我只是采用了最新版本的 Windows 版 XAMPP,并使用標(biāo)準(zhǔn)配置的 MySQL 數(shù)據(jù)庫(kù)。順序版本: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)                }            }        }()}為什么第一個(gè)版本比第二個(gè)版本慢?有任何想法嗎?我是否可能使用了錯(cuò)誤的函數(shù)來(lái)插入數(shù)據(jù)?
查看完整描述

1 回答

?
一只名叫tom的貓

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊

運(yùn)行有很多開(kāi)銷INSERT

  • 客戶端和服務(wù)器之間的通信。

  • 解析INSERT

  • 打開(kāi)桌子等。

  • 獲取下一個(gè)AUTO_INCREMENT值。

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

  • 提交交易。

所有這些都在單個(gè) CPU 中完成,并在必要時(shí)等待 I/O。

你有 50 個(gè)線程;他們跑的速度是原來(lái)的 24 倍。

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

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


查看完整回答
反對(duì) 回復(fù) 2023-08-14
  • 1 回答
  • 0 關(guān)注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)