大量のデータをINSERTする場面があってなんとか高速化できないかと思って、
以下の手法を比較してみた。

  1. 1件ずつINSERTする
  2. トランザクションを使用する
  3. 1クエリでまとめてINSERTする

テスト環境は以下の通り。
  • MySQL 5.1
  • テーブルはInnoDB、AUTO_INCREMENT付き(innodb_autoinc_lock_mode=1)
  • PHP 5.3.6

1000件、3000件、5000件、10000件と件数を増やしながらそれぞれ5回ずつ試行して平均を取っている。
使用したコードは最後に。

結果

手法 1,000件 3,000件 5,000件 10,000件
1件ずつINSERTする 0.517 1.619 2.560 5.201
トランザクションを使用する 0.230 0.766 1.288 2.437
1クエリでまとめてINSERTする 0.037 0.260 0.270 0.522


件数によって差はあるものの大雑把に言うと、

  • トランザクションを使用すると2倍高速
  • 1クエリでまとめてINSERTすると10倍高速

という感じに。クエリを作る処理が面倒くさいけど1クエリにまとめるのが圧倒的に速い。
なるほどねー



ちなみに

処理時間を記録してみたのは良いのだけど、
全体の処理時間に占める割合が1割程度で処理の遅さの原因は他にあることがわかったので、
この結果はあんまり役に立たなかった。
もうちょっと複雑なテーブル、クエリだったら違うだろうけど。



コード概要

だいぶでっち上げ感がありますが。
データの準備、PDOの設定などの部分は割愛。

1件ずつINSERTする


トランザクションを使用する


1クエリでまとめてINSERTする