[MySQL]バルクインサートとマルチプルインサート

バルクインサートとマルチプルインサートが今頃別物だと気付いたのでまとめる。ググってても勘違いしてるひと多い。

■通常のインサート

インサート毎にコミットを行う。インサートのコストは高く負荷の原因になることしばしば。

BEGIN;
INSERT INTO tbl_name (a, b, c) VALUES (1, 2, 3);
COMMIT;
BEGIN;
INSERT INTO tbl_name (a, b, c) VALUES (4, 5, 6);
COMMIT;
BEGIN;
INSERT INTO tbl_name (a, b, c) VALUES (7, 8, 9);
COMMIT;


■バルクインサート

1回のコミットで複数のインサートを実行。コミットの回数が少ない分処理が早い。

BEGIN;
INSERT INTO tbl_name (a, b, c) VALUES (1, 2, 3);
INSERT INTO tbl_name (a, b, c) VALUES (4, 5, 6);
INSERT INTO tbl_name (a, b, c) VALUES (7, 8, 9);
COMMIT;


■マルチプルインサート

1つのクエリで複数行分のレコードをインサート。コミットももちろん1回だけ。

BEGIN;
INSERT INTO tbl_name (a, b, c) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9);
COMMIT;


- - -

Doctrine2 では一通りエンティティを persist してから flush するので気を利かせて
マルチプルインサートしてくれてるものと思っていたけど実際にはバルクインサート。
とはいえ、バルクインサートでも十分コスト削減になる。

そもそもマルチプルインサートができる DB が限られているので DB を選ばない ORM だと
マルチプルインサートは割愛される。2015年現在でマルチプルインサートができるのは
MySQL と PostgreSQL だけとのこと。

技術ブログっぽくそれぞれの実行結果出したいところだけど割愛。

かわのくんとは

Web系IT企業でプログラミングやマネジメントをしています。趣味で音楽を少々。

Youtubeでライブ動画配信中

Ustreamでライブ動画配信中

スマートフォン向けにPCサイトを自動変換(コンバート)する『CONV2SP』 CSS作成支援ツール『CSSツクール』