INSERT INTO target SELECT a, b FROM source WHERE ...-- 1. 刪除非主鍵索引(主鍵通常保留)
ALTER TABLE `target` DROP INDEX `idx_a`, DROP INDEX `idx_b`;
-- 2. 批量導入數據
INSERT INTO `target` (`a`, `b`) SELECT `a`, `b` FROM `source` WHERE ...;
-- 3. 重建索引
ALTER TABLE `target` ADD INDEX `idx_a` (`a`), ADD INDEX `idx_b` (`b`);
| 階段 | 有索引 | 無索引 |
|---|---|---|
| 寫入 | 每行插入需更新 B+ 樹(隨機 IO、分頁分裂) | 順序追加到數據頁,極快 |
| 索引建立 | 增量維護,總開銷大 | 掃描全表一次排序建立(Bulk Load),效率高數倍 |
sort_buffer_size, innodb_sort_buffer_size:加速索引排序。innodb_flush_log_at_trx_commit = 2(導入期間臨時調整,事後恢復 1)。LOAD DATA INFILE 替代 INSERT ... SELECT,速度更快。「直接
DISABLE KEYS/ENABLE KEYS」僅對 MyISAM 有效,InnoDB 不支援。請用DROP INDEX/ADD INDEX。