INSERT 改為多值 INSERT INTO t VALUES (...), (...), (...),減少網路往返與解析開銷LOAD DATA INFILE**:比 INSERT 快 20 倍以上concurrent_insert=2 # 允許尾部並發插入,不阻塞讀取
# 方案一:降低寫優先級
low_priority_updates=1
# 方案二:寫鎖計數閾值
max_write_lock_count=1
bulk_insert_buffer_size=64M # 預設 8MB,大量導入時調大
ALTER TABLE t DISABLE KEYS; -- 停用索引更新
LOAD DATA INFILE 'data.txt' INTO TABLE t;
ALTER TABLE t ENABLE KEYS; -- 重建索引 (一次性排序建立,極快)
空表導入無需 DISABLE KEYS (MyISAM 空表導入會先寫資料再建索引)。
INSERT DELAYED INTO t VALUES (...);
資料入隊列立即返回,背景執行緒批次寫入。注意:無法獲取自增 ID、唯一鍵衝突延後發現、崩潰風險。
SET unique_checks=0;
SET foreign_key_checks=0;
SET autocommit=0;
-- 大量導入操作
SET autocommit=1;
SET foreign_key_checks=1;
SET unique_checks=1;
每 1000-5000 行 COMMIT 一次,避免單一巨大交易導致 Undo Log 膨脹與鎖持有過久。
InnoDB 按主鍵聚簇索引儲存,**主鍵遞增插入**為順序寫入 (追加頁),亂序主鍵導致頁分裂、碎片、隨機 I/O。建議使用 AUTO_INCREMENT 或有序 UUID (如 ULID/TSID)。
innodb_log_file_size 調大 (如 1GB) 減少 Checkpoint 壓力innodb_flush_log_at_trx_commit=2 導入階段可暫時放寬 (風險:崩潰丟失 1 秒資料)innodb_doublewrite=OFF 導入階段可關閉 (風險:頁損壞)| 優化手段 | MyISAM | InnoDB |
|---|---|---|
| 批次 INSERT | ✅ 極大提升 | ✅ 極大提升 |
| LOAD DATA | ✅ 首選 | ✅ 首選 |
| DISABLE/ENABLE KEYS | ✅ 有效 | ❌ 不支援 |
| 關閉唯一/外鍵檢查 | N/A | ✅ 必做 |
| 關閉自動提交 | N/A | ✅ 必做 |
| 並發插入 | ✅ concurrent_insert=2 | 行級鎖天然並發 |
| 主鍵順序 | 次要 | ✅ 關鍵 |
Innodb_row_lock_waits、Table_locks_waited 確認無異常阻塞