資料載入效能的根本差異在於索引快取刷新頻率。單筆 INSERT 每寫入一列就觸發一次索引快取刷新,而批次操作(LOAD DATA 或多值 INSERT)可累積多筆資料後一次性刷新,大幅減少 I/O 開銷。同理,無索引狀態下載入避免了每筆資料維護索引樹的成本,載入完成後再建立索引,總耗時遠低於邊載入邊維護索引。
LOAD DATA INFILE 直接由伺服器讀取檔案,省去網路傳輸與多次 SQL 解析LOAD DATA LOCAL INFILE,但會經由客戶端傳輸,效能較差FILE 權限且檔案置於伺服器可讀取路徑INSERT INTO t (a,b) VALUES (1,2), (3,4), (5,6), ...;
mysqldump 匯出時加入 --extended-insert 或 --opt(預設含 extended-insert)產出多值 INSERT--complete-insert:會產生單列 INSERT,解析成本高、語句冗長--compress 啟用壓縮協議INSERT 語句中省略有 DEFAULT 定義的欄位| 場景 | 建議做法 |
|---|---|
| 大量資料載入新資料表 | 先建表不建索引 → 載入資料 → CREATE INDEX 一次建立 |
| 既有表大量追加資料 | 評估:DROP INDEX → 載入 → CREATE INDEX 是否比邊載入邊維護快(重建索引成本 vs 累積維護成本) |
| MyISAM 表需頻繁大量寫入 | 建表指定 DELAYED_KEY_WRITE=1 或啟動參數 --delayed-key-write 延遲索引刷新 |
當長時間 SELECT 與頻繁 INSERT 爭用同一張表導致效能下降時:
INSERT ... SELECT 或 LOAD DATA 批次合併至主表適用於 MyISAM/ISAM 表,需具備伺服器主機帳號與表檔案寫入權:
# 禁用索引
myisamchk --keys-used=0 -rq /path/to/db/tbl_name.MYI
# 載入資料後啟用索引
myisamchk -rq /path/to/db/tbl_name.MYI
注意:操作期間需遵循表修復鎖定協議(參考 MySQL 手冊第 13 章),防止伺服器同時修改表檔案導致損毀。
CREATE TABLE t (...) ENGINE=MyISAM DELAYED_KEY_WRITE=1;mysqld --delayed-key-write=ONFLUSH TABLES 或表關閉時myisamchk 修復流程LOAD DATA INFILE?→ 是 → 最優解INSERT?→ 是 → 加 --compress、省略預設值欄位DELAYED_KEY_WRITE 降低索引 I/OMySQL 資料載入優化的核心在於最小化索引維護頻率與減少 SQL 解析與網路往返。根據資料量級、表結構、網路環境與業務對即時性的要求,組合上述策略可獲得數量級的效能提升。建議在正式環境套用前,先於測試環境以真實資料量進行基準測試,驗證各策略實際收益。