2010-02-21

ActiveRecordのパフォーマンスチューニングをしてみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
RailsのActiveRecordのパフォーマンスチューニングをざっくりとした感じで試しました。

アプリケーションの内容は、csvファイルを受け取りそこのデータをデータベースに読み込ませるというもので、データのチェックとして4つぐらいマスターテーブルにデータが存在するかどうかのチェックを行うというものです。

実行時間は、
log/development.log
に記録されるものを利用します。

まず最初の状態。
Completed in 328217ms (DB: 116445)

マスターファイルにデータが存在するかどうかを
find_by_xxx
で行っていたのですが、これは遅いよみたいなことがあったので、これをすべて
find
に書き換えた結果。
Completed in 308355ms (DB: 117323)

さらにマスター検索部分をcache_fuを利用してmemcachedにキャッシュさせた時の結果。
Completed in 262213ms (DB: 39203)

マスター検索ぐらいの比較的類似データの検索がかかるようなものは、DBのキャッシュにひっかかり、memcachedを利用してもそんなに変わらないと思っていたのですが、結構かわるもんですね。

ちなみに
cache_fu
を利用するために
gem install system_timer --include-dependencies
gem install memcache-client --include-dependencies
./script/plugin install git://github.com/defunkt/cache_fu.git
をやって、
マスター用のモデルに以下のようなコードを書きました。

class Zip < ActiveRecord::Base
acts_as_cached :ttl => 10.minutes

def self.get_zip_cache(code)
self.get_cache("zip_#{code}") do
find(:first,:conditions => ["zipcode = ?",code])
end
end
end

こんなコードを書いた後に
Zip.find(:first,:conditions => ["zipcode = ?",code])
していた部分を
Zip.get_zip_cache(code)
と変更しています。
コメントを投稿