數據裝載(Data Loading)雖不如 SELECT 查詢複雜,但大批量導入時,微小優化累積效應顯著。核心邏輯三點:
LOAD DATA INFILEINSERT 快 **20 倍以上**(官方數據)FILE 權限,文件須在服務器本地LOAD DATA INFILE '/data/orders.csv'
INTO TABLE orders
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(order_id, user_id, amount, created_at);
LOAD DATA INFILE 優於 LOAD DATA LOCAL INFILELOCAL 關鍵字意味著:客戶端讀文件 → 經網絡發送給服務器 → 服務器寫入LOCAL-- 慢:N 條單行 INSERT
INSERT INTO t VALUES (1); INSERT INTO t VALUES (2); ...
-- 快:單條多行 INSERT(每批 500-2000 行視行長度而定)
INSERT INTO t (a,b,c) VALUES
(1,2,3), (4,5,6), (7,8,9), ...;
-- mysqldump 導出時必加參數
mysqldump --extended-insert # 或 --opt (含 extended-insert)
-- 禁用 --complete-insert(產生單行 INSERT,極慢)
bulk_insert_buffer_size(MyISAM 專用,默認 8M)可進一步加速批量插入索引構建LOAD DATA 或多值 INSERT)原理:逐行插入時,每行都需隨機訪問多棵索引樹修改;批量建索引則採用排序+順序構建,I/O 為順序寫入,速度快數量級。
-- 實操步驟
CREATE TABLE big_table (id INT PRIMARY KEY, col1 INT, col2 VARCHAR(50)) -- 無二級索引
LOAD DATA INFILE 'data.txt' INTO TABLE big_table;
ALTER TABLE big_table ADD INDEX idx_col1 (col1), ADD INDEX idx_col2 (col2);
INSERT DELAYED / DELAYED_KEY_WRITE(MyISAM 專用)INSERT DELAYED:客戶端立即返回,行入隊列,服務器空閒時批量寫入。適用於「寫入不需即時可見」場景(日志、統計)。多客戶端寫入會合併塊寫入,極大減少索引刷新。DELAYED_KEY_WRITE=1 表選項 / 全局 --delayed-key-write=ON:索引塊不即時刷盤,待塊被替換或 FLUSH TABLES 時才寫入。風險:崩潰導致索引損壞,需 REPAIR TABLE 恢復。問題:長時間 SELECT 鎖定表/行,阻塞高頻 INSERT。
方案:臨時表緩衝 + 定期批量合併
tmp_logs(無索引/少索引,極快)
2. 定時任務(每分鐘/每小時)INSERT INTO main_logs SELECT * FROM tmp_logs; TRUNCATE tmp_logs;
3. 讀取端查詢主表,不受寫入衝突影響
-- 錯誤:自動提交模式下每行一提交
INSERT INTO t VALUES (1); -- 隱式 COMMIT
INSERT INTO t VALUES (2); -- 隱式 COMMIT
...
-- 正確:顯式事務包裹批量插入
START TRANSACTION;
INSERT INTO t VALUES (1),(2),(3),...; -- 批量 100-1000 行
COMMIT;
-- 重複上述批次
innodb_flush_log_at_trx_commit=1 時每提交必須 fsync)LOCK TABLES,InnoDB 用事務替代表鎖--compress(mysqldump、mysql client、應用驅動均支持)-- 表定義:col3 INT DEFAULT 100
-- 插入時省略 col3
INSERT INTO t (col1, col2) VALUES (1, 'abc');
-- 好處:SQL 更短,網絡包更小,解析更快,服務端自動填充默認值
LOAD DATA INFILE(文件在服務器) → **首選**LOAD DATA LOCAL INFILE 或應用層分批多值 INSERTDELAYED_KEY_WRITEINSERT DELAYED 或 臨時表緩衝合併innodb_log_file_size、innodb_buffer_pool_size數據裝載優化的本質是**將隨機、碎片、高頻的操作,轉化為順序、批量、低頻的操作**——這正是計算機系統性能優化的普世真理。