以下の手法を比較してみた。
- 1件ずつINSERTする
- トランザクションを使用する
- 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の設定などの部分は割愛。