# 文本文件準備:字段Tab分隔,行換行符,NULL用\N
LOAD DATA LOCAL INFILE '/data/huge_import.txt'
INTO TABLE target_table
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
(col1, col2, col3);
bulk_insert_buffer_size (默認8M) 調大至 256M-1G,MyISAM專用,InnoDB無效-- 惡例:逐行提交,每次網絡往返+事務提交
INSERT INTO t VALUES (1); INSERT INTO t VALUES (2); ...
-- 優例:單語句千行批次
INSERT INTO t (col1, col2) VALUES
(1, 'a'), (2, 'b'), (3, 'c') ... (1000, 'x');
max_allowed_packet[mysqld]
concurrent_insert=2 # 1: 尾部無洞插入(默認) 2: 尾部允許有洞插入 0: 禁用
SELECT加共享鎖,INSERT加排他鎖,默認互斥concurrent_insert=2 允許在表尾部有刪除空洞時仍並行插入DELETE操作或僅尾部刪除,中間無碎片INSERT DELAYED INTO log_table (msg) VALUES ('event_data');
LOCK TABLES target_table WRITE;
INSERT INTO target_table ...; -- 批量插入
INSERT INTO target_table ...;
UNLOCK TABLES; -- 單次索引刷盤
INSERT ... VALUES (...),(...),... 已隱含單次提交,無需額外鎖表START TRANSACTION;
INSERT INTO target_table ...;
INSERT INTO target_table ...;
COMMIT; -- 單次Redo Log刷盤 (innodb_flush_log_at_trx_commit=1)
| 場景 | 首選方案 | 關鍵參數 |
|---|---|---|
| 離線全量導入 (TB級) | LOAD DATA + 禁用索引/外鍵 | SET FOREIGN_KEY_CHECKS=0; ALTER TABLE DISABLE KEYS; |
| 在線業務批量寫入 | 多值 INSERT 批次提交 | 應用層批次 1000-5000 行 |
| 高併發日志寫入 | 異步隊列 + 批量消費 | Kafka/RocketMQ → 消費者批量 INSERT |
| MyISAM 讀寫並存導入 | concurrent_insert=2 | 表尾部無碎片 |
SET FOREIGN_KEY_CHECKS=0;
SET UNIQUE_CHECKS=0;
ALTER TABLE huge_table DISABLE KEYS; -- MyISAM專用
LOAD DATA INFILE ... INTO TABLE huge_table ...;
ALTER TABLE huge_table ENABLE KEYS; -- MyISAM專用,重建索引
SET UNIQUE_CHECKS=1;
SET FOREIGN_KEY_CHECKS=1;
InnoDB無DISABLE KEYS,但可通過SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0;跳過約束檢查,導入後重新開啟觸發檢查。