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