【发布时间】:2020-12-01 22:19:29
【问题描述】:
我有一些代码可以在数据库中插入记录:
该代码应该在数据库中插入 15M 条记录,现在,在 AWS t2.large 实例上需要 60 小时。我正在寻找在不重复记录的同时更快地在数据库中插入的方法。
你们对我有什么建议吗?
我正在使用 Gorm 和 MYSQL。
// InsertJob will insert job into database, by checking its hash.
func InsertJob(job XMLJob, oid int, ResourceID int) (Job, error) {
db := globalDBConnection
cleanJobDescription := job.Body
hashString := GetMD5Hash(job.Title + job.Body + job.Location + job.Zip)
JobDescriptionHash := GetMD5Hash(job.Body)
empty := sql.NullString{String: "", Valid: true}
j := Job{
CurrencyID: 1, //USD
//other fields here elided for brevity
PrimaryIndustry: sql.NullString{String: job.PrimaryIndustry, Valid: true},
}
err := db.Where("hash = ?", hashString).Find(&j).Error
if err != nil {
if err.Error() != "record not found" {
return j, err
}
err2 := db.Create(&j).Error
if err2 != nil {
log.Println("Unable to create job:" + err.Error())
return j, err2
}
}
return j, nil
}
【问题讨论】:
-
如果你的哈希不是主键,你可以在它上面创建一个索引来加速 WHERE 查询。批处理插入也可以提高速度。
-
我同意,一次插入 N 个条目而不是一个一个地插入应该可以大大提高性能,以防您的数据库不在同一台机器上(因为您需要更少的通信网络)。您还可以一次检查多个哈希值,并解析输出以确定哪些是重复的,哪些不是。
-
谢谢@John 我一定会试试这个:)
-
@DmitryVerhoturov 这是一个很棒的建议!我下次试试
-
向我们展示
SHOW CREATE TABLE和生成的INSERT语句。 (@John - 我同意;批处理行通常可以提速 10 倍。)
标签: mysql xml performance go go-gorm