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;”。