大量資料匯入時,策略選擇直接決定效能差異可達數量級。本文彙總七大高效載入策略,從SQL語法選擇到儲存引擎特性調優。
LOAD DATA INFILEINSERT快數倍,伺服器直接讀取本地檔案,避免客戶端網路傳輸開銷。LOAD DATA LOCAL INFILELOCAL需客戶端讀檔再經網路傳送至伺服器,效率顯著較低。INSERT必須批次化INSERT改為多值單語句:INSERT INTO t VALUES (...), (...), (...);INSERT 打包進事務BEGIN; INSERT INTO t VALUES (...); INSERT INTO t VALUES (...); ... COMMIT;避免自動提交模式下每條語句刷新重做日誌。
LOCK TABLES t WRITE; INSERT ...; UNLOCK TABLES;mysql --compress或連線字串加Compress=true,減少網路傳輸量,**但會增加CPU開銷**,小心使用。INSERT語句盡量省略有DEFAULT的欄位,減少網路封包大小與解析時間。CREATE TABLE t ( ... ) ENGINE=MyISAM; -- 無索引 LOAD DATA INFILE ...; ALTER TABLE t ADD INDEX ...; -- 載入完再建索引不適用於InnoDB/BDB(聚簇索引結構決定必須逐筆維護)。
| 方法 | 啟用索引 | 停用索引 |
|---|---|---|
ALTER TABLE | ALTER TABLE t ENABLE KEYS; | ALTER TABLE t DISABLE KEYS; |
myisamchk | myisamchk --recover --quick --keys-used=n t | myisamchk --keys-used=0 t |
n為位元遮罩:第0位對應第一個索引,三個索引則n=7 (0b111)。myisamchk --description t可查索引編號。
DISABLE KEYS + LOAD DATA + ENABLE KEYSLOAD DATA + 適當調大innodb_buffer_pool_size/innodb_log_file_sizeINSERT事務根據資料量、引擎、網路環境靈活組合上述策略,可將TB級資料匯入時間從數天壓縮至數小時。