2010-05-20

rails2.3.5でマルチプルinsertをする

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
mysqlのinsertのパフォーマンスをあげる方法として、マルチプルinsertを使うという方法があります。

以下のようなVALUESをいっぱい書いた感じのSQLです。
INSERT INTO <表名>
[ <列名> [ , <列名> ... ] ]
VALUES ( <値> [ , <値> ... ] ) ,
VALUES ( <値> [ , <値> ... ] ) ,
・・・


railsでは通常、普通のinsertが発行されてマルチプルinsertは使えません。

しかし、
ActiveRecord::Extensions
を使えばできちゃいます。

インストールは、
gem install ar-extensions
でOK。

そしてenvironment.rbに
config.gem 'ar-extensions'
を追加します。

そうすれば、importというメソッドが利用できるようになります。
使い方は、以下のような感じです。
columns = [ :author, :title ]
values = [ [ 'araki', 'jojo' ],[ 'oda', 'onep' ] ]
Book.import columns, values

ActiveRecord::Extensions
はマルチプルinsertだけでなく他にもいろいろ拡張されています。
詳しくは以下のサイトが参考になります。
http://d.hatena.ne.jp/yoshitetsu/20080129/1201610369
ちなみにrails3では、ActiveRecord::Extensions利用できなそうな気配なのですが、importだけならば
activerecord-import
というので、できる感じです。

activerecord-importは以下をご覧ください。
http://github.com/zdennis/activerecord-import/

ちなみに、このマルチプルinsertを使ってみた結果です。
500件まとめてinsertしてみました。
処理の前半で余計な前処理を結構しているので単純にinsert性能だけではないのですが、ご参考までに。

仕様前
 件数 約3500件  Completed in 198245ms (DB: 10444)
 件数 約10000件 Completed in 492626ms (DB: 21144)
使用後
 件数 約3500件  Completed in 169225ms (DB: 8538)
 件数 約10000件 Completed in 415683ms (DB: 16482)
コメントを投稿