【MySQL】バルクインサートやループ処理で効率良くINSERTしよう

【MySQL】 バルクインサートやループ処理 で効率良くINSERTしよう データベース
スポンサーリンク

はじめに

ぴんくうさぎ
ぴんくうさぎ

テストデータの作成で、一つ一つinsert文を

作るのが大変だよ。もう少しいいやり方ないかな?

みどりがめ
みどりがめ

なるほど、そういうときは

バルクインサートやループ処理を使うと良いよ!

この記事で分かること
  • MySQLでのバルクインサートの使い所と使用方法
  • MySQLでのループ処理の使い所と使用方法

以下SQL学習のおすすめUdemy講座を紹介しています。是非、ご覧ください。

前提条件(今回使用するテーブル)

今回は下記のtaskテーブルを使用します。id,title,contentのみのシンプルなテーブルです。

create table if not exists task(
id VARCHAR(3),
title VARCHAR(50),
content VARCHAR(100)
);

通常のINSERT文

まずは、通常のINSERT文を一応、記載しておきます。taskテーブルに対して、5件INSERETするには、下記のように書きます。

insert into task (id,title,content) values(1,'title','content');
insert into task (id,title,content) values(2,'title','content');
insert into task (id,title,content) values(3,'title','content');
insert into task (id,title,content) values(4,'title','content');
insert into task (id,title,content) values(5,'title','content');

結果は、idが1~5でinsertされて下記になります。

INSERT結果(通常)

BULK INSERT(バルクインサート)

次にバルクインサートについて紹介します。
バルクインサートの定義は以下の通りです!

テーブルに行を追加する際、複数の行を1回のSQL文の実行で追加すること

バルクインサートは1回のトランザクションで実行できるため、通常のSQL文を複数回実行するよりも
実行速度が速いです。また、コードの記述量も減るので、データ作成時の負担軽減にも繋がります。

さて、実際にバルクインサートでtaskテーブルへのINSERT文を書いていきます。

insert into task (id,title,content) values
(1,'title','content'),
(2,'title','content'),
(3,'title','content'),
(4,'title','content'),
(5,'title','content');

いかがでしょう?2行目以降は、values以降のデータ部分だけ書けば良いのでだいぶすっきりします。

もちろん、実際のシステムやアプリ開発のINSERT時にも使用できるので、大量データの挿入時には検討してみてください。

ループ処理による大量データの作成

続いて、ループ処理による大量データの作成方法について記載していきます。

こちらは性能試験等でとにかく大量のデータが必要な時に重宝します。
短いコードで1000行でも10万行でもINSERTできます。

MySQLでループ処理を記述する場合、プロシージャーを使用するのが簡単です。
プロシージャー(Procedure)の定義は以下の通りです。

テーブルの対する一連の操作をまとめて関数のように実行できる仕組みのこと。

定義として書くとわかりにくいですが、要は関数のようなものです。引数にINSERTする数を受け取って、引数の数だけINSERT処理を行うことを想像すると分かりやすいでしょうか?

それでは、実際のSQL文を見ていきます。始めてみるとむずかしそうに見えますが、読んでみると全然難しくないと思います。コメントを追いつつ読み解いてみてください。

drop procedure if exists loop_sample;
-- 区切り文字を一時的に「;」→「//」に変更する
delimiter //
-- loop_sampleというプロシージャーを作成する
create procedure loop_sample(in i int)
begin
  -- 変数cntの定義
  declare cnt int default 0;
  -- 繰り返し処理
  while cnt < i do
    set cnt = cnt + 1;
    insert into task values(cnt,'title','content');
  end while;
end
//
-- プロシージャーを実行する
call loop_sample(5);

現在はプロシージャの引数に5を入れていますが、この値を変えることで、INSERTするデータ数を変えることができます。

ちなみに、下記のようにCONCAT()を使用することで、titleやcontentにも連番を付与することができます。

    insert into task values(cnt,CONCAT('title',cnt),CONCAT('content',cnt));
INSERT結果(ループ処理)

終わりに

本記事はここまでとなります。ご覧いただきありがとうございました。

ご指摘等がございましたら頂けますと嬉しいです。
引き続き、プログラミングについて定期的に発信していきますのでよろしくお願いします!
また、もしよろしければtwitterもフォローしていただけると嬉しいです。

コメント