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

N + 1 問題の概要と Railsにおける解決方法

toridori
January 10, 2025
73

N + 1 問題の概要と Railsにおける解決方法

toridori

January 10, 2025
Tweet

Transcript

  1. 1. 今回のテーマのきっかけ 2. N + 1 問題について 3. 実際にN +

    1 を体験してみる 4. Rails(ActiveRecord)を用いた検証 5. RailsにおけるN + 1 問題の解決方法 6. Rails(ActiveRecord)を用いたN+1解決後の検証 7. まとめ 目次
  2. N + 1 問題について 一覧データを取得するために SELECT を 1回 実行 表示するデータに関連するデータを取得するためのSELECTをN

    回実行 データベースへのアクセスがN + 1 回実行されてしまう問題  N + 1 問題とは
  3. 実際にN + 1 を体験してみる 筆者名 夏目漱石   太宰治 谷崎潤一郎 樋口一葉 森鴎外

    書籍名 こころ 人間失格 細雪 たけくらべ 舞姫・沈黙の塔 筆者が複数の書籍を持つ一覧ページ  N + 1 問題が起こりうる画面を作ってみる
  4. 主テーブル 従テーブル 1 : N Authors Books   1 :

    N のリレーションを持つDBを用意する 実際にN + 1 を体験してみる
  5. select * from books where author.id = n; Authors Books

    select * from authors; authorsを1 回 取得すると 関連するbooksをN 回 取得してしまう。。 1 N 実際にN + 1 を体験してみる
  6. N 一連の処理が終わるまでに 52156 ms 経過しています。 つまり、ページ表示に約 52 秒 かかってしまっています。。  

    ログを確認すると... Rails(ActiveRecord)を用いた検証 ~ ページ表示の大幅な遅延 ~
  7. 1 : N の 関連を持つデータを事前取得する場合   状況によって使い分けよう   preload 関連先の要素で絞り込みを行いたい場合

      eager_load 1 : 1 の関連など1クエリでデータを取得した方が効率が良い場合   include 関連先が1つだけの場合 ※ 関連が複数ある場合、個別に最適化できないので非推奨 RailsにおけるN + 1 問題の解決方法
  8. • ORMを利用して実装する時に、関連するリソースの取得時にN + 1 問題が発 生する場合がある。 • パフォーマンスの悪化や、過剰なSQLの発行に気づいて初めてN + 1

    問題に 認知できることが多い。 • 解決策として、クエリ結合や、クエリの最適化を行うことなどがある。   それらを行うことにより、SQLの発行数を抑えることができる。 まとめ