プログラミング初学者のブログです。主に Ruby on Rails を学んでいます。
TECH CAMP受講中。

8月10日:SQL、N+1問題、includesメソッド

こんばんは。

今日は山の日ですね。本来山の日は8月11日ですが、今年と来年はオリンピックの影響で日付を変えているらしいですね。へー。

 

今日はしょぼいですが夜2時間勉強しました。

 

SQL

【N+1問題】

  • アソシエーションしていると起きる、テーブルにアクセスしすぎ問題。
  • 1対多 の関係のデータをDBに問い合わせるとき、
    1:ユーザー
    多:コメント
    で、「特定のユーザーに紐づくコメントをとってくる」というときに、
    1回目:ユーザーテーブルから全ユーザーのデータをとってくる
    2回目:コメントテーブルから1人目のユーザーに紐づくデータをとってくる
    3回目:コメントテーブルから2人目のユーザーに紐づくデータをとってくる
    ・・・
    N回目:コメントテーブルからN人目のユーザーに紐づくデータをとってくる
  • こんな感じでユーザーテーブル1+コメントテーブルN回のSQLが発行され、データ量が多くなる程テーブルへの問い合わせ回数が増えて、動作が遅くなる。

【includesメソッド】

  • N+1問題を解決する救世主。
  • 引数にアソシエーションで定義した関連名を指定することで、1回で全ユーザーに紐づくデータをとってこれる。
@users = User.includes(:comment)

 

若干CSSをいじってみました。無駄にgooglefonts使ってみた。