前回まではSelect系のパフォーマンスを紹介しました。
今回はInsertのパフォーマンスについてふれてみます。
Insert方式は用途に応じて各種選択が可能です。
大量データの一括ロード時は、SQL文のパースが必要ないバルクロードを利用すると効果的です。
アプリケーション仕様上、登録行セットをまとめることが可能であれば、MySQL独自構文であるマルチプルInsert文(1回のInsert文発行で複数行セットをInsertする)を利用すると効果的です。

 

  • バルクロード :可変長データ(CSV等)、固定長データからのデータロード
    mysql> LOAD DATA INFILE “import_data.csv” INTO TABLE tableA FIELDS TERMINATED BY ‘,’ ENCLOSED BY ‘”’; 
  • マルチプルInsert(MySQL独自構文):Insert文1発行で複数行セットを挿入するInsert文
    mysql> INSERT INTO emp (empid,name,country) VALUES(1,’taro’,’jpn’),(2,’jiro’,’usa’),(3,’saburo’,’ita’),(4,’shiro’,’chu’);
    ※1Insert文のサイズは、初期化パラメータ max_allowed_packet以内となることが条件
  • 通常Insert:Insert文1発行で1行を挿入するInsert文
    mysql> INSERT INTO emp (empid,name,country) VALUES(1,’taro’,’jpn’);
    mysql> INSERT INTO emp (empid,name,country) VALUES(2,’jiro’,’usa’);

■処理時間比較
Row長約200bytes、100万件(約200Mbytes)のデータを投入した場合の比較 (単位:秒)
(サーバ環境とMySQLパラメータは前項目と同一。NO RAID、元データは同じローカルDISKよりロード)

Insert
処理方式
1Insertの行セット数 MySQL 5.0.79 MySQL 5.1.30
InnoDB MyISAM InnoDB MyISAM
バルクロード 31.99 31.24 37.79 31.51
マルチプルInsert 1,000行 78.86 2,104.75 95.39 2,048.20
500行 102.88 2,560.96 132.01 2,392.40
100行 300.38 3,554.03 370.88 3,393.88
通常Insert※ 1行 25,459.00 27,887.00 28,284.00 29,797.00

※1000件分を計測し×1000で算出

 

【参考】1,000万件ロード時

Insert処理方式 MySQL 5.0.79 / MySQL 5.1.30
InnoDB MyISAM
バルクロード 805.78 / 864.08 366.28 / 371.06