Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ActiveRecordの速度改善Tips2020冬

patorash
November 25, 2020

 ActiveRecordの速度改善Tips2020冬

patorash

November 25, 2020
Tweet

More Decks by patorash

Other Decks in Programming

Transcript

  1. ActiveRecordの 速度改善Tips 2020 冬 株式会社リゾーム システム開発部 尾古 豊明 2020-11-25(水) 社内勉強会

  2. これは2015年に発表した資料の焼き直し š 第9回中国地方DB勉強会 IN 米子での発表資料 https://www2.slideshare.net/chariderpato/heroku-active-record-tips

  3. ActiveRecord高速化の肝 š DBへのアクセス回数を減らす š 大量のデータを一度に取得しない š 使うカラムのデータだけ取得する š そもそもDBにアクセスしない š

    適切なindexを設定する
  4. DBへのアクセス回数を減らすには? š パフォーマンス監視ツールを使う(rack-mini-profiler) š N+1問題の発生を検知するgemを使う(bullet) š counter_cacheを使う(Railsにある機能) š eager_load, preload,

    includes, left_joins, joinsなどのメソッドを使う š 大きいテーブルをjoinすると1回のクエリで済むが逆に性能が悪化するケースもあるので注意
  5. 大量のデータを取得しないようにするには? š find_each, find_in_batches, in_batchesなどのメソッドを使う š デフォルトで1,000件ずつ処理する š orderが効かないので注意 š

    ページングを行う(kaminari) š 存在チェックには、present?ではなく、exists?を使う š present?はモデルのオブジェクト作ってしまっているし、全部取得している š select * from ~ where ~ š exists?はクエリがシンプル š select 1 from ~ where ~
  6. 使うカラムのデータだけ取得するには? š selectメソッドで絞り込む š - articles.select(:id, :title).each do |article| =

    link_to article.title, article_path(article) end š pluckメソッドで値だけ取得する š - articles.pluck(:id, :title).each do |(id, title)| = link_to title, article_path(id) end
  7. そもそもDBにアクセスしないには? š フラグメントキャッシュなどを使う š 1回アクセスしたときの結果をキャッシュして再利用する š 頻繁に更新されないもの、且つ頻繁に参照されるものに関して有用(トップページとか) š データを更新したときにキャッシュを削除し忘れると事故になるので注意

  8. 以上