MySQL顺序插入速度较慢,而线程插入速度较快-为什么?

问题描述 投票:-1回答:1

我发现,与多线程解决方案相比,将数据顺序插入到我的数据库中要慢得多,在多线程解决方案中,两者都插入相同数量的行。在我的顺序方法中,插入50000行花费了大约4分钟,而并行版本只花费了大约10秒。

我使用https://github.com/go-sql-driver/mysql驱动程序。对于数据库,我只是将最新版本的XAMPP用于Windows,并使用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)
                }
            }
        }()
}

为什么第一个版本比第二个版本这么慢?有任何想法吗?我可能使用了错误的函数来插入数据吗?

mysql performance go goroutine
1个回答
0
投票

[运行INSERT有很多开销:

  • 客户端和服务器之间的通信。
  • 解析INSERT
  • 打开桌子等。>
  • 获取下一个AUTO_INCREMENT值。
  • 检查冲突,死锁等
  • 提交交易。
  • 并且所有这些都在单个CPU中完成,并在需要时等待I / O。

您有50个线程;他们跑了24倍。

但是您可以做的十倍-一次将行批量成一个INSERT 100行。这消除了很多开销,尤其是提交。 (超过100-1000行将导致收益和其他间接费用的减少;因此请停在那里。)

同时,使用的线程不要多于拥有的CPU内核数量的两倍。否则,它们只会彼此绊倒。 可能

为什么50个线程的速度是[[only的24倍。
© www.soinside.com 2019 - 2024. All rights reserved.