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

N+1問題について調べてみた

Avatar for Yuxki Yuxki
July 01, 2024
17

 N+1問題について調べてみた

N+1問題について調べてみた

Avatar for Yuxki

Yuxki

July 01, 2024
Tweet

Transcript

  1. 自己紹介 • 自己紹介 ◦ エンジニア職への就職(アプリのバックエンド)を目指して、日々勉強中です。 経験者と初心者の中間くらいだと思ってます。(実務2年 →個人開発3年) ▪ 実務2年では、主にJavaとSQLで管理会計のWEBアプリを開発 ▪

    個人開発では、主にセキュリティと VPSでオンプレっぽくインフラを勉強して いました。 ◦ Vimmer ◦ Go,Python,TypeScript ◦ 委託開発先ではバックエンドの開発をやってます。 ▪ 約半年生き残りました!🎉🎉🎉 2
  2. 「N+1」の例 (テーブル) 6 author(著者) ID id 名前 name 生年月日 birthday

    book(本) ID id 名前 name 著者ID author_id 言語ID language_id • 本テーブルが著者テーブルと言語テーブルとのリレーションを持つとする。 language(言語) ID id 名前 name
  3. 「N+1」の例 (レコード) 7 • 以下のようなレコードを持つとする book(本) id name author_id language_id

    1 Javaの基礎 1 1 2 Goの基礎 1 1 language(言語) id name 1 日本語 author(著者) ID name birthday 1 山田太郎 1991/01/01
  4. 「N+1」の例 (処理) 9 • 以下のような処理を実行する。(ピンク色はレスポンスするパラメータ) 1. SELECT * FROM book

    WHERE book.id = “1”;を実行する 2. {“id”: “1”, “name”:“Javaの基礎”, “author_id”: “1”, “language_id”: “1”}が返る。これを元にさらにSELECT句を実行する。 3. SELECT * FROM author WHERE author.id = 1;を実行する。 4. {“id”: “1”, “name”:“山田太郎”}が返る 5. SELECT * FROM language WHERE language.id = 1;を実行する。 6. {“id”: “1”, “name”:“日本語”}が返る このネスト構造のような取得方法が「N+1」という現象。
  5. 問題としての「N+1」 11 テーブルA テーブルB テーブルC • 以下のようなデータ構造があったとして、A~Fのデータが必要で、「N+1」の方法で 取得するとする。すると最低でも合計5クエリ必要。 • 中間テーブルのレコード数が1つ増えるたびに、3テーブル分のクエリが追加され

    る。 • このデータ構造からリスト形式の画面を作るとなると、テーブル B以降のクエリの多 さはテーブルAから読み取るレコードに比例して多くなる。 中間テーブルZ テーブルG テーブルH