読み込みが増えて DB が重いとき、どんな手をどの順で打ちますか

まず測って重い読み込みを特定し、SQL とインデックスを直す、接続の数を整える、よく読む物を手前に置く、読み込み専用の複製 (リードレプリカ) に分ける、と安くて戻しやすい手から順に打つ、と答える問い。複製の遅れで「書いたのに見えない」が起きることへの手当てと、分割 (シャーディング) を最後に回す理由まで話します。

まず 4 択で考える

2 問

答えに入れるべき考えを選びます。選ぶと、すぐに正誤と解説が出ます。そのあと下の欄で、自分の言葉で答えてみます。

  1. 問 1読み込みが増えて DB が重い。最初に打つ手として正しいものはどれか

  2. 問 2リードレプリカを入れたら「プロフィールを保存したのに、古い名前が出る」と言われた。手当てとして正しいものはどれか

2 問中 0 問に答えました

答えてみる

面接官に「読み込みが増えて DB が重いとき、どんな手をどの順で打ちますか」と聞かれたつもりで、答えを見る前に自分の言葉で、声に出して答えてみます。

解説を読む

聞かれ方から関連するコースまで、この問いの解説を全部ここに置いています。

こう聞かれます

  • 「読み込みが増えて DB が重いとき、どんな手をどの順で打ちますか」
  • 「リードレプリカを足せば解決しますか」(裏から聞く形)
  • 「DB を分割 (シャーディング) するのは、どんなときですか」

面接官が見ている点

  • いきなり大きな構成の変更に飛ばず、測って原因を特定してから手を打つか
  • 安くて戻しやすい手から順に並べられるか
  • リードレプリカの遅れで、書いた直後の読み込みが古くなることを知っているか
  • 分割の重さ (作り直しの量、戻しにくさ) を分かったうえで、最後の手にしているか

短い答え

  • まず測って、どの読み込みが重いかを特定し、SQL とインデックスを直します。いちばん安く、効くことが多い手だからです。
  • それでも足りなければ、接続の数を整え、よく読まれて変わりにくい物をキャッシュに置き、次に読み込み専用の複製 (リードレプリカ) へ読み込みを分けます。
  • 複製は少し遅れて追いつくので、書いた直後に自分の書いた物を読む画面は元の DB から読みます。表を分割するのは、ここまでで足りないときの最後の手です。

この問いを含む分野をレッスンで練習する

レッスンを開く

少し詳しい答え

打つ手の順番

安くて戻しやすい手から順に打ちます。

  1. 測るどの SQL が、どれだけの回数と時間で重いかを掴みます。CPU が高いのか、ディスクの読み込みが多いのか、接続が足りないのかも見ます
  2. SQL とインデックスを直す 全部の行を読んでいる、同じ SQL を何十回も流している (N+1)、といった物を直します。台数を増やさずに済むことが多い手です
  3. 接続の数を整えるアプリの台数が増えると、DB への接続が上限に近づきます。コネクションプールの大きさをそろえ、必要なら間に接続をまとめる仕組みを置きます
  4. 手前で返すよく読まれて、少し古くてもよい物はキャッシュに置き、DB まで来ないようにします
  5. 読み込みを複製に分ける書き込みは元の DB (主)、読み込みは複製 (リードレプリカ) へ送ります。複製は台数を足して読み込みの力を増やせます
  6. DB を大きくする、分割する 1 台を大きくするのは早くて作りを変えずに済みますが、上限があります。表を複数の DB に分ける分割は、最後の手です

複製の遅れ

多くの構成では、複製は元の DB の変更を少し遅れて写します。ふだんは短い遅れでも、重い書き込みが続くと遅れが伸びます。

その間に複製から読むと、「プロフィールを保存したのに、画面には古い名前が出る」ことが起きます。手当ては次の通りです。

  • 書いた直後の画面や、自分の書いた物を読む所は、元の DB から読む
  • 書いてからしばらくの間は、その人の読み込みを元の DB に寄せる
  • 残高や在庫のように、古い値で判断すると困る読み込みは、いつも元の DB から読む

複製の遅れは監視し、遅れが大きいときは複製から外す仕組みも考えます。

分割を最後に回す理由

表を利用者の id などで複数の DB に分けると、書き込みも読み込みも分けられますが、別の DB にまたがる結合やトランザクションが使えなくなり、アプリの作りを大きく変えることになります。分け方を間違えると一部の DB に偏り、後から分け直すのは大仕事です。だから、ほかの手で足りないことを数で確かめてから選びます。

トレードオフ

キャッシュも複製も、「少し古い値を読むかもしれない」ことと引き換えに、DB の負担を減らします。どの画面ならどれだけ古くてよいかを、画面ごとに決めることになります。台数を増やすほど費用と見る物も増えるので、目標の速さを数字で置き、届いたら止めます。

話す例は架空の例で構いません。「ランキングの画面が重く、まず SQL を直し、次に結果をキャッシュし、それでも朝の山で足りないのでリードレプリカに分けた」のように、どの順で何を打ったかを話せると伝わります。

よくある間違い

  • 測らずに、まずリードレプリカを足す重い SQL はそのまま複製の上でも重く、費用だけ増えます
  • すべての読み込みを複製に送る書いた直後の画面で古い値が出ます。読み込みごとに、古くてよいかを決めます
  • 早いうちから分割する結合やトランザクションが使いにくくなり、戻すのも大変です

深掘りの問い

  • 「書き込みが重いときは、どうしますか」複製は書き込みを減らさないので、書き込みをまとめる、キューで後回しにする、要らない書き込みやインデックスを減らす、それでも足りなければ分割、と答えます
  • 「キャッシュとリードレプリカは、どう使い分けますか」 同じ結果を何度も読むならキャッシュ、条件がばらばらで同じ結果になりにくい読み込みならリードレプリカ、と答えます
  • 「複製が止まったら、どうしますか」読み込みを元の DB かほかの複製に寄せ、元の DB が耐えられるかを先に見積もっておく、と答えます

確認日 2026年10月30日書き手 小尾 知希 (講師)

技術面接問題の一覧へ戻る