Railsの高速化の履歴
Railsで動いているサービスが遅い。
そもそもRailsのことを根本的に理解していなかったので、とりあえずlogみて、おどろいた。
- ・・・なんじゃ、このクエリーの数は!?
ログをみながらごにょごにょしながらわかったことは、このフレームワークは開発が楽になるように作られていることで、大量のデータを扱うときは書き方に気をつけないといけないということ。
例えばController側で
@user = User.find(:all)
としてあったとしても、ビュー側で
<% @user.each dp |user| %> <%= user.name %> <%= user.area.name %> <% end %>
としたばあい、@userの長さ分だけAreaを見に行く。
@userが長ければ長いほど大変なことに。
見つけた文献ではこれは「N+1 クエリー問題」というらしい。
たしかに@user.area.nameでAreaを呼び出せるのはらくだが、そんな現実を知ると不用意に扱えなくなる。
ってことで、解決方法としては、「Eager Loading」というのがあり、簡単にいうと最初に全部呼び出しとけってことだそうだ。
@user = User.find(:all :include => {:area})
ってやっておくと、最初のクエリであらかじめAreaを呼び出してくれるので、その後に@user.areaをしてもいちいちクエリをださない。
光が射したぜ・・・、なんとかなりそうだ。