【问题标题】:XML Insert Performance into MYSQLXML 将性能插入 MYSQL
【发布时间】: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


【解决方案1】:

您可以使用信号量模式加快速度。

https://play.golang.org/p/OxO8pNy3bc6

灵感来自这里。

https://gist.github.com/montanaflynn/ea4b92ed640f790c4b9cee36046a5383

【讨论】:

  • 我们最终放弃了 GORM 并进行批量插入。
  • 你应该使用 gorm v2。它支持批量插入。
  • 感谢您提请我注意!!!在发帖时,Gorm V2 还不是一个东西......
猜你喜欢
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 2016-12-10
  • 2014-11-24
  • 2011-12-20
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多