S 0134fcf4b36809e06b94dc4001167cad 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をしてもいちいちクエリをださない。

光が射したぜ・・・、なんとかなりそうだ。

もしかして

    他の人の「Railsの高速化」

    S 0134fcf4b36809e06b94dc4001167cad

    最新

      最新エントリ

        関連ツイート