使用MySQLの生成されたストアド・プロシージャまたは削除テストデータ量

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 collat​​ion_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;」上記のようにクエリ結果を、実行します。

リリース3元の記事 ウォンの賞賛0 ビュー243

おすすめ

転載: blog.csdn.net/a82514921/article/details/104011746