2 回答
TA贡献1827条经验 获得超8个赞
对于 Postgresql,您可以使用ON CONFLICT DO NOTHING
我已经在我这边用 postgresql db 尝试了下面的代码,它忽略了有错误的插入行。我做了一些其他的改变来尝试在我这边。您可以忽略我的其他更改。
func insert(db *sql.DB, values []string) error {
tx, err := db.Begin()
if err != nil {
return err
}
defer tx.Commit()
stmt, err := tx.Prepare("INSERT INTO foo ( foo_col) VALUES ($1) ON CONFLICT DO NOTHING")
if err != nil {
fmt.Println("errro at stmt", err)
return err
}
defer stmt.Close()
for _, value := range values {
_, err = stmt.Exec(value)
if err != nil {
fmt.Println(value, err)
}
}
return nil
}
对于 mysql,你可以使用INSERT IGNORE
stmt, err := tx.Prepare("INSERT IGNORE INTO foo ( foo_col) VALUES ($1) ")
TA贡献1875条经验 获得超3个赞
我对该问题的解决方案如下所示:
不要创建单个事务并将所有语句添加到其中,而只是运行它而不创建事务。
当值被读入时,生成新的 go 例程并让事务并行运行(注意连接限制)。
没有并行化,性能下降了大约 30%(从 25k 值的 20s 到 30s——我们之前没有使用并行化)。
通过并行化,性能提高了大约 4 倍(达到 5 秒)——请注意保持在连接范围内
- 2 回答
- 0 关注
- 173 浏览
添加回答
举报