INSERT INTO ... SELECT 是 MySQL 表間大量資料複製的標準寫法。本文透過實測展示從 12 筆資料指數級增長至 314 萬筆的耗時變化,並說明適用場景與注意事項。
user、目標表 user_his,欄位含 id(PK)、username、passwordINSERT INTO `user_his`(`id`,`username`,`password`)
SELECT `id`,`username`,`password` FROM `user`;
| 資料筆數 | 耗時 | 備註 |
|---|---|---|
| 12 ~ 3,072 | 0.07 ~ 0.17 秒 | 極快 |
| 6,144 ~ 24,576 | 0.28 ~ 0.99 秒 | 線性增長 |
| 49,152 ~ 196,608 | 1.98 ~ 8.89 秒 | 開始明顯 |
| 393,216 ~ 786,432 | 17 ~ 38 秒 | 倍數增長 |
| 1,572,864 ~ 3,145,728 | 1 分 11 秒 ~ 2 分 29 秒 | 千萬級瓶頸 |
INSERT INTO SELECT 表現良好;innodb_buffer_pool_size、或使用 LOAD DATA INFILE 配合 SELECT ... INTO OUTFILE 雙管齊下;IGNORE 或 ON DUPLICATE KEY UPDATE。