おぎやす広辞苑
mindiaおぎやす広辞苑見出し語

Railsの高速化

おぎやす · 2010-12-02 更新 · 1 ポイント

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

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

関連する見出し語

コメント

西小倉パンデイロ · 2010-12-03

次のステップに入ってきてるなぁ。
僕も頑張る。

syatin · 2010-12-04

SQLのチューニングを日々の開発でやっている身としては、抽象化されてるフレームワークSQLクエリが気になって仕方が無いです。特に速度面。
SQL実行計画は、どうなってるんだろう・・・。勝手にindex張ってくれないですよね?(自分で定義作れるって聞いたので)

おぎやす · 2010-12-06

railsはindexは勝手にはってくれないです。
migrationの時に書き込んでおかないといけないようです。

でももともとのmigrationファイルには定義されていなかったので、今から全部にindex貼るのは正直しんどいです・・・。