Railsの高速化
1pt
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をしてもいちいちクエリをださない。
光が射したぜ・・・、なんとかなりそうだ。
次のステップに入ってきてるなぁ。
僕も頑張る。
SQLのチューニングを日々の開発でやっている身としては、抽象化されてるフレームワークのSQLクエリが気になって仕方が無いです。特に速度面。
SQL実行計画は、どうなってるんだろう・・・。勝手にindex張ってくれないですよね?(自分で定義作れるって聞いたので)
railsはindexは勝手にはってくれないです。
migrationの時に書き込んでおかないといけないようです。
でももともとのmigrationファイルには定義されていなかったので、今から全部にindex貼るのは正直しんどいです・・・。