ユアマイスター株式会社エンジニアブログ

ユアマイスター株式会社のエンジニアが日々徒然。

N+1問題



N+1問題とは?

アソシエーションをした上でeach doで紐づいた先のデータを取って来る際に データベースに取りに行く回数が多い分SQL文が多く発行される。すなわち、時間がかかる

膨大な量になると重くなってしまう…. f:id:yourmystar_engineer:20170423214103p:plain

N+1問題の解決方法 rails

controller.rbの編集

 Post.all

 Post.all.include(:user)

f:id:yourmystar_engineer:20170423214142p:plain このように保存領域(データベース)から値を取って来る処置速度(SQL文)をはやめてあげることでアプリケーション自体の読み込みも早くなります。

gemファイルを使って問題が起きている箇所を特定

  • bullet
gem 'bullet'

config/enviroments/developmemt.rb参照 bulletの設定を記述

  config.after_initialize do
    Bullet.enable  = true   # 以下はN+1問題を発見した時のユーザーへの通知方法
    Bullet.alert   = true   # ブラウザのJavaScriptアラート
    Bullet.bullet_logger = true # Rails.root/log/bullet.log
    Bullet.console = true   # ブラウザの console.log の出力先
    Bullet.rails_logger = true # Railsのログ
    Bullet.add_footer   = true # 画面の下部に表示
  end

f:id:yourmystar_engineer:20170424022156p:plain このように、N+1問題が起きている場所ではアラートが出てきてくれる
他にも' rack-mini-profiler'というgemでも問題を特定できます。