MySQL 顺序插入速度慢,而螺纹插入速度快 - 为什么?

MySQL sequential inserts are slow while threaded inserts are fast - why?

我发现与插入相同行数的多线程解决方案相比,按顺序将数据插入我的数据库非常慢。 在我的顺序方法中插入 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)
                }
            }
        }()
}

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

运行 和 INSERT:

中有很多开销
  • 客户端和服务器之间的通信。
  • 解析 INSERT
  • 打开table等
  • 获取下一个 AUTO_INCREMENT 值。
  • 检查冲突、死锁等
  • 提交 t运行操作。

所有这些都在一个 CPU 中完成,如有必要,等待 I/O。

您有 50 个线程;他们 运行 快了 24 倍。

但您可以做到 10 倍的效果 -- 将行批量合并为单个 INSERT 100 行。这消除了很多开销,尤其是提交。 (超过 100-1000 行会逐渐减少 returns 和其他开销;所以到此为止。)

与此同时,使用的线程数不要超过您拥有的 CPU 内核数的两倍。否则,他们只会互相绊倒。 可能 就是为什么 50 个线程 快 24 倍。