我发现,与多线程解决方案(它们都插入相同数量的行)相比,向数据库中顺序插入数据的速度非常慢。 在我的顺序方法中,插入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)
}
}
}()
}
为什么第一个版本比第二个版本慢?
有任何想法吗?我可能使用了错误的函数来插入数据吗?
答案 0 :(得分:1)
运行INSERT
有很多开销:
INSERT
AUTO_INCREMENT
值。所有这些操作都在单个CPU中完成,必要时可以等待I / O。
您有50个线程;他们跑了24倍。
但是您可以做的十倍-一次将行批量成一个INSERT
100行。这消除了很多开销,尤其是提交。 (超过100-1000行将导致收益和其他间接费用的减少;因此请停在那里。)
同时,使用的线程不要超过拥有的CPU内核数量的两倍。否则,它们只会彼此绊倒。 可能是为什么50个线程仅 快24倍的原因。