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