Go 语言 MySQL Update 200 万条数据的正确姿势是什么?

2017-07-20 16:53:38 +08:00
 billion

根据主键来更新每一条数据。

stmt, err := db.Prepare("update xxx set age=? where primaryid = ?")
panic(err)
_, err2 := stmt.Exec(age, id)

由于主键是唯一的,所以需要一条一条的更新。这种情况下,开了 2000 个 goroute 速度还是非常慢。请问有什么好办法吗?

6025 次点击
所在节点    Go 编程语言
46 条回复
nullen
2017-07-21 09:11:54 +08:00
跟语言没多大关系,2 个方法:
1、拼 SQL 批量执行;
2、批量事务:
START
UPDATE xxx SET age=? WHERE primaryid = ?
UPDATE xxx SET age=? WHERE primaryid = ?
UPDATE xxx SET age=? WHERE primaryid = ?
....
COMMIT
Clarencep
2017-07-21 09:39:06 +08:00
INSERT ON DUPLICATE 👍+1
CryMeatel
2017-07-21 09:46:23 +08:00
@nullen 👍+1
kofj
2017-07-21 09:54:03 +08:00
这么多回答,也就俩人说到了事务
billion
2017-07-21 11:02:40 +08:00
我发现使用了事务以后,速度反而慢下来了。
我用 100 个 goroute 一条一条更新,基本上可以实现 1 秒 1000 行。

使用了事务以后,还是 100 个 goroute,每个事物 1000 条,一个事务执行完成需要 1 分钟左右。
@nullen @honeycomb
nullen
2017-07-21 11:06:56 +08:00
说到这里推荐大家一个帖子,几年前看到的,当时受益匪浅:
https://stackoverflow.com/questions/1711631/improve-insert-per-second-performance-of-sqlite

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/376742

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX