使用MySQL存儲過程批量生成或刪除測試數據

1. 目標

有時需要在數據庫中插入大量數據,用於測試應用在大數據量時的運行是否正常,可以使用MySQL存儲過程,批量生成或刪除測試數據。

2. 存儲過程腳本

在以下腳本中,每插入/刪除5000條數據提交一次。插入10萬條數據耗時約3.7秒,刪除耗時約1.2秒。

在執行批量插入/刪除操作時,可以根據需要修改插入總記錄數、每次事務插入的記錄數、具體的插入操作、每次事務刪除記錄數、具體的刪除操作等。

2.1. 批量生成測試數據

DROP PROCEDURE IF EXISTS insert_procedure;

# 將語句的結束符號從分號 ; 臨時改爲兩個//
delimiter //

CREATE PROCEDURE insert_procedure ()
exit_label:
BEGIN
   -- 插入總記錄數(根據需要修改)
   DECLARE total        int DEFAULT 100000;
   -- 每次事務插入的記錄數(根據需要修改)
   DECLARE page         int DEFAULT 5000;
   -- 每次插入實際記錄數
   DECLARE insert_num   int DEFAULT 0;
   -- 提交插入的總次數
   DECLARE num          int DEFAULT 0;
   -- 外層循環下標
   DECLARE n1           int DEFAULT 1;
   -- 內層循環下標
   DECLARE n2           int DEFAULT 1;
   -- 當前循環的起始數字
   DECLARE start        int DEFAULT 0;
   -- 每次插入的流水號字段
   DECLARE seq          VARCHAR(32);

   -- 除法只有整數部分,沒有小數部分
   SET num = total / page;

   IF (num = 0)
   THEN
      -- 退出
      LEAVE exit_label;
   END IF;

   -- 判斷模是否爲0,非0時需要將總次數加1
   IF (total % page != 0)
   THEN
      SET num = num + 1;
   END IF;

   -- 外層循環
   WHILE n1 <= num
   DO
      -- 開始事務
      START TRANSACTION;

      IF (n1 < num)
      THEN
         -- 非最後一次插入
         SET insert_num = page;
      ELSE
         -- 最後一次插入
         SET insert_num = total - page * (num - 1);
      END IF;

      -- 內層循環
      SET start = page * (n1 - 1);

      WHILE n2 <= insert_num
      DO
         -- 執行插入(根據需要修改)
         SET seq = concat("testtime", unix_timestamp(now()), "num", start + n2);

         INSERT INTO test_table(id,flag,create_time,update_time)
         VALUES (seq,seq,now() - INTERVAL '5' DAY,now() - INTERVAL '5' DAY);

         SET n2 = n2 + 1;
      END WHILE;

      -- 提交事務
      COMMIT;

      -- 外層循環下標加1
      SET n1 = n1 + 1;
      -- 內層循環下標置1
      SET n2 = 1;
   END WHILE;
END
//
# 將語句的結束符號恢復爲分號 ;
delimiter ;

# 執行存儲過程
CALL insert_procedure;


SHOW PROCEDURE STATUS LIKE '%insert_procedure%';

SHOW PROCESSLIST;

2.2. 批量刪除測試數據

DROP PROCEDURE IF EXISTS delete_procedure;

# 將語句的結束符號從分號 ; 臨時改爲兩個//
delimiter //

CREATE PROCEDURE delete_procedure ()
exit_label:
BEGIN
   -- 每次事務刪除記錄數(根據需要修改)
   DECLARE page         int DEFAULT 5000;
   -- 記錄每次刪除返回記錄數
   DECLARE delete_num   int DEFAULT 0;

   WHILE 1 = 1
   DO
      -- 開啓事務
      START TRANSACTION;

      -- 執行刪除操作(根據需要修改)
      DELETE FROM test_table
      WHERE id LIKE 'testtime%'
      LIMIT page;

      -- 獲取被刪除的行數,需要在提交事務之前執行
      SET delete_num = ROW_COUNT();

      -- 提交事務
      COMMIT;

      IF (delete_num = 0)
      THEN
         -- 退出
         LEAVE exit_label;
      END IF;
   END WHILE;
END
//
# 將語句的結束符號恢復爲分號 ;
delimiter ;

# 執行存儲過程
CALL delete_procedure;

3. 其他命令

3.1. 查看存儲過程狀態

執行“SHOW PROCEDURE STATUS”命令可以查看存儲過程狀態,命令如下所示:

SHOW PROCEDURE STATUS LIKE '%insert_procedure%';

輸出信息示例:

Db Name Type Definer Modified Created Security_type Comment character_set_client collation_connection Database Collation
testdb insert_procedure PROCEDURE test@localhost 2020/1/9 21:31:00 2020/1/9 21:31:00 DEFINER latin1 latin1_swedish_ci latin1_swedish_ci

3.2. 查看當前執行的存儲過程

執行“SHOW PROCESSLIST;”可以查看當前正在執行的存儲過程,輸出信息示例如下。

Id User Host db Command Time State Info Progress
218919458 test localhost:64027 testdb Query 0 call my_procedure 0

3.3. 結束存儲過程執行

當需要結束正在執行的存儲過程時,可執行“KILL”命令加上述查詢結果的Id值,如“KILL 218919458;”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章