1.目的
時には、大量のデータで実行中のアプリケーションをテストするため、データベース内の大量のデータを挿入する必要が通常である、あなたはMySQLのストアドプロシージャを使用、またはボリューム生成されたテストデータを削除することができます。
2.ストアドプロシージャスクリプト
次のスクリプトでは、各挿入は/一度提出した5000件のデータを削除します。10万データを挿入し、それは1.2秒程度かかり削除するには、約3.7秒かかります。
一括挿入/削除操作を実行するときに、必要なレコードの改変総数に応じて挿入することができる、各トランザクションが挿入されたレコードの数、挿入の特定の操作、削除されたレコードの数、各トランザクション、特定の削除操作。
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の手順STATUS」コマンドを実行します:
SHOW PROCEDURE STATUS LIKE '%insert_procedure%';
出力例:
DB | 名前 | タイプ | 定義 | 変更されました | 作成した | SECURITY_TYPE | コメント | character_set_client | collation_connectionの | データベースの照合 |
---|---|---|---|---|---|---|---|---|---|---|
TESTDB | insert_procedure | 手順 | テスト@ localhostの | 2020年1月9日夜9時31分00秒 | 2020年1月9日夜9時31分00秒 | DEFINER | LATIN1 | latin1_swedish_ci | latin1_swedish_ci |
3.2。現在実行中のストアドプロシージャを見ます
「SHOW PROCESSLISTと、」実行現在実行中のストアドプロシージャは、以下の例示的な出力を表示することができます。
同上 | ユーザー | ホスト | デシベル | コマンド | 時間 | 状態 | インフォ | 進捗 |
---|---|---|---|---|---|---|---|---|
218919458 | テスト | ローカルホスト:64027 | TESTDB | 質問 | 0 | コール | my_procedure | 0 |
3.3。ストアドプロシージャの実行を終了
ストアドプロシージャを終了する必要が行われているとき、「KILL」指令値Idを加えて、そのような「KILL 218919458;」上記のようにクエリ結果を、実行します。