[golang]如何使用 gorm 高效執行批量插入 (可以透過 Create()、CreateInBatches(),或者 原生 SQL 語句 來提升效率)
方法 1:使用 CreateInBatches()(推薦)
CreateInBatches() 是 gorm 提供的批量插入方法,支援設定單批次的筆數,適合大規模資料寫入。
範例
優勢:
- 可控每批插入筆數,減少單次 SQL 負擔(如
100筆一批)。 - 支援事務,避免部分插入失敗導致數據不一致。
限制:
CreateInBatches()會執行 多次 SQL 語句,並非一次性批量插入。
方法 2:使用 Create()(小批量可用)
如果批量插入的筆數較少(如小於 500 筆),可以直接使用 Create(),因為 gorm 會自動優化成批量 SQL。
範例
優勢:
- 簡單易用,適合小批量數據插入。
限制:
gorm內部會將多條 INSERT 合併執行,但當筆數超過一定限制時,仍會拆分成多次 SQL,影響效率。
方法 3:使用 gorm 原生 SQL
對於 大量數據插入(上萬筆),可以直接使用 原生 SQL 語句,這是最快的方法,因為可以控制 SQL 執行的行為。
範例
優勢:
- 一次性插入所有數據,SQL 效率最高。
- 完全控制 SQL 語法,可以使用
ON DUPLICATE KEY UPDATE或IGNORE,防止重複插入。
限制:
- 需要手動構造 SQL,較為繁瑣,但能提供最佳性能。
方法 4:使用 gorm 事務(確保數據一致性)
如果插入過程中發生錯誤,應該使用事務確保數據一致性。
範例
優勢:
- 確保數據完整性,如果插入失敗,可以回滾數據。
- 適合銀行、訂單等場景,避免部分數據寫入成功,部分失敗導致數據不一致。
哪種方法最快?
| 方法 | 適用場景 | 優勢 | 缺點 |
|---|---|---|---|
Create() | 小批量(少於 500 筆) | 簡單易用,gorm 內部會優化 | 當數據過多時,SQL 會拆分影響性能 |
CreateInBatches() | 中等批量(500~100000 筆) | 控制批次大小,避免單次 SQL 過大 | 仍會執行多次 SQL,不是最優解 |
| 原生 SQL | 大規模批量(10 萬筆以上) | 最高效,單次 SQL 插入大量數據 | 需要手動構造 SQL |
| 事務插入 | 確保數據一致性 | 失敗可回滾,不會有部分成功、部分失敗的問題 | 事務操作會增加額外開銷 |
總結
- 少量數據(小於 500 筆) →
Create() - 中等數據(500 ~ 100000 筆) →
CreateInBatches() - 大規模數據(10 萬筆以上) →
Exec()原生 SQL - 需要事務確保一致性 → Begin() / Commit() / Rollback()
留言
張貼留言