2 回答

TA貢獻1827條經(jīng)驗 獲得超8個贊
對于 Postgresql,您可以使用ON CONFLICT DO NOTHING
我已經(jīng)在我這邊用 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條經(jīng)驗 獲得超3個贊
我對該問題的解決方案如下所示:
不要創(chuàng)建單個事務(wù)并將所有語句添加到其中,而只是運行它而不創(chuàng)建事務(wù)。
當(dāng)值被讀入時,生成新的 go 例程并讓事務(wù)并行運行(注意連接限制)。
沒有并行化,性能下降了大約 30%(從 25k 值的 20s 到 30s——我們之前沒有使用并行化)。
通過并行化,性能提高了大約 4 倍(達到 5 秒)——請注意保持在連接范圍內(nèi)
- 2 回答
- 0 關(guān)注
- 246 瀏覽
添加回答
舉報