在資料庫性能測試、壓力測試或開發環境初始化時,往往需要快速生成大量測試數據。MySQL 的 INSERT ... SELECT 語句能高效實現表內數據自我複製,幾秒鐘內即可生成百萬級記錄。
INSERT INTO 目標表 (字段1, 字段2, ...)
SELECT 字段1, 字段2, ...
FROM 來源表;
CREATE TABLE ler_items (
id INT AUTO_INCREMENT PRIMARY KEY,
classid INT,
title VARCHAR(100),
address VARCHAR(200),
zipcode VARCHAR(20)
);
-- 插入 1 條種子數據
INSERT INTO ler_items (classid, title, address, zipcode)
VALUES (1, '測試標題', '測試地址', '100000');
-- 第 1 次:1 → 2 條
INSERT INTO ler_items (classid, title, address, zipcode)
SELECT classid, title, address, zipcode FROM ler_items;
-- 第 2 次:2 → 4 條
INSERT INTO ler_items (classid, title, address, zipcode)
SELECT classid, title, address, zipcode FROM ler_items;
-- 重複執行 ~20 次即可達到 100 萬+ 記錄
INSERT INTO ler_items (classid, title, address, zipcode)
SELECT classid, title, address, zipcode
FROM ler_items
LIMIT 1000000; -- 配合 LIMIT 控制數量
| 技巧 | 說明 |
|---|---|
| 批量提交 | 每 1 萬條提交一次事務,避免 Undo Log 過大 |
| 關閉索引 | 大量導入前 DROP INDEX,導入後重建,大幅提速 |
| 調大 innodb_buffer_pool_size | 建議設為物理內存 70%-80% |
| 使用 LOAD DATA INFILE | 比 INSERT SELECT 更快,適用於 CSV 導入 |
UUID() 或 CONCAT(id, '_', RAND()))CREATE TABLE new_table LIKE old_table 可快速複製結構(含索引)INSERT ... SELECT 是 MySQL 內建的高效數據複製工具,無需外部腳本即可快速生成測試數據。結合事務批量提交、索引暫存等技巧,可在分鐘級時間內構建千萬級測試集,極大提升測試效率。