2023年2月26日SHAREツイートシェアはてブLINE最近、扱うデータ量の多い現場でN+1問題に直面し、レビュー指摘を頂きました。Railsでの解決方法」を整理しておきます。・パフォーマンス改善を行いたい人N+1問題とはループ処理の中で、都度SQLを発行し、結果的に大量のSQLが実行されてパフォーマンスが悪化する問題です。RailsではActiveRecordを利用してモデル操作を行いますが、ActiveRecordが便利すぎるあまりSQLを意識しなくなるので、N+1のコードが普通に実装され、パフォーマンスが悪化してから発覚することが多々あります。ある実装1つの記事(article)に複数のタグ(tag)が紐づくこととします。:articleend記事一覧画面では、記事の一覧画面で記事に紐づくタグも一緒に表示させます。endendViewでは、記事ごとにループして一覧を作成し、さらに記事に紐づくタグをループして表示するコードとなります。%>記事のループの中でタグのループを行なっており「記事数×タグ数」分のクエリが実行され、結果的にパフォーマンス悪化につながります。JOINで結合しキャッシュする。1;クエリの数が1個で済むので場合によってはpreloadより速いJOINしているので、preloadと違って、JOINしたテーブルで絞込ができるpreload指定したモデルを複数のクエリに分けてキャッシュする。endend少ないデータではほとんどパフォーマンスに影響が出ないのでなかなか意識しませんが、アクセス頻度が高い場合や、扱うデータ量が多い場合などは大きな差が出てきますので、普段から意識してN+1問題を回避するよう心がけましょう。コメントをキャンセルメールアドレスが公開されることはありません。※サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。勉強したことや気になったことをアウトプットしていきます。