大量資料匯入是常見運維場景。本文由淺入深介紹 5 種優化策略,實測效能可提升數十倍。
INSERT INTO `t` (`a`,`b`) VALUES (1,2),(3,4),(5,6)...;
bulk_insert_buffer_size(MyISAM)或 innodb_log_buffer_size(InnoDB)加速緩衝刷盤。INSERT DELAYED INTO `t` VALUES ...;
若表無刪除空洞,concurrent_insert=ALWAYS 允許 SELECT 與 INSERT 並行。
LOAD DATA INFILE '/path/data.csv'
INTO TABLE `t`
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
--local-infile 參數可從客戶端上傳。LOCK TABLES `t` WRITE;
INSERT INTO `t` VALUES ...; -- 多條
UNLOCK TABLES;
索引緩衝區僅在 UNLOCK 時刷盤一次。
START TRANSACTION;
INSERT INTO `t` VALUES ...; -- 多條
COMMIT;
DISABLE KEYS(MyISAM)或 SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0;(InnoDB)。LOAD DATA 並預先排序主鍵順序(InnoDB 聚簇索順序寫入最快)。innodb_buffer_pool_size、innodb_log_file_size、innodb_flush_log_at_trx_commit=2(匯入期間)。ANALYZE TABLE 更新統計資訊。