我发现与插入相同行数的多线程解决方案相比,按顺序将数据插入我的数据库非常慢。
在我的顺序方法中插入 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)
}
}
}()
}
为什么第一个版本比第二个版本慢?
有任何想法吗?我是否使用了错误的函数来插入数据?
最佳答案
运行 INSERT
有很多开销。 :
INSERT
AUTO_INCREMENT
值(value)。 所有这些都在单个 CPU 中完成,如有必要,还需要等待 I/O。
你有 50 个线程;他们跑得快了 24 倍。
但你可以做到 10 倍——将行批量为单个
INSERT
一次 100 行。这消除了大部分开销,尤其是提交。 (超过 100-1000 行会导致 yield 递减和其他开销;所以停在那里。)同时,使用的线程数不要超过你所拥有的 CPU 内核数的两倍。否则,他们只会相互绊倒。这可能就是为什么 50 个线程的速度只有 24 倍。
关于MySQL顺序插入很慢,而线程插入很快 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59305917/