首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 使用 INSERT SELECT 快速生成百萬級測試數據

     編輯:MySQL 綜合教學

前言

在資料庫性能測試、壓力測試或開發環境初始化時,往往需要快速生成大量測試數據。MySQL 的 INSERT ... SELECT 語句能高效實現表內數據自我複製,幾秒鐘內即可生成百萬級記錄。

核心語法與原則

INSERT INTO 目標表 (字段1, 字段2, ...)
SELECT 字段1, 字段2, ...
FROM 來源表;

必須遵循的四大原則

  1. 不可自引用:SELECT 不能從被插入數據的同一張表中選擇行(會報錯)
  2. 字段數量一致:目標表字段數 = SELECT 返回字段數
  3. 數據類型兼容:對應字段類型相同或可隱式轉換
  4. 主鍵/唯一鍵處理:若有自增主鍵,INSERT 時不指定該列,由資料庫自動生成

實戰範例:指數級增長生成百萬數據

步驟 1:建立基礎表並插入種子數據

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');

步驟 2:自我複製實現指數增長

-- 第 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 萬+ 記錄

進階版:單條 SQL 實現百萬級插入

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 內建的高效數據複製工具,無需外部腳本即可快速生成測試數據。結合事務批量提交、索引暫存等技巧,可在分鐘級時間內構建千萬級測試集,極大提升測試效率。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved