为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信