0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

新卒後輩に伝えたいDBのチューニング

Posted at

データベースのチューニングは、「なぜ遅いのか?」を見つけて「ムダを減らす」作業です。
ここでは初心者にもわかりやすく、チューニングの観点と手順を解説します。

1. チューニングの基本的な考え方

  • DBは“クエリをどう処理するか”を決めて動く
    EXPLAIN ANALYZE で処理の中身(実行計画)を見て改善する。

  • 「最も遅い処理」を特定し、そこだけ直す
    → 速いSQLをさらに速くするより、遅いSQLを1つ直したほうが効果的。

  • チューニングの順序は「計測 → 特定 → 改善 → 再計測」
    → 数字(実行時間)で改善を確認する

2. 初心者が見るべき3つのポイント

① クエリ(SQL)

  • 不必要なデータを取っていないか?
    • SELECT * ではなく、必要なカラムだけ指定する。
  • JOINが多すぎないか?
    • 本当に必要なテーブルだけJOINする。
  • 集計(GROUP BY / ORDER BY)を最小限にできないか?
    • ソートはDBで重い処理。インデックスやアプリ側処理も検討。

② インデックス

  • WHERE句の条件に使われるカラムにインデックスがあるか?

    SELECT * FROM users WHERE email = 'abc@example.com';
    

    email にインデックスがなければ全件検索(Seq Scan)になる。

  • JOINに使うキーにもインデックスをつける
    JOINの効率が大幅に改善される。

  • 不要なインデックスは削除

    • 多すぎるとINSERT/UPDATEが遅くなる。

③ 実行計画(EXPLAIN ANALYZE)

  • Seq Scan(全件走査)になっていないか?
    • WHERE句のカラムにインデックスを貼ると Index Scan に変わることが多い。
  • Nested Loop(繰り返し結合)が多重ループしていないか?
    • テーブルサイズ × テーブルサイズ で爆発的に遅くなることがある。
  • Sortが重い(Tempファイルに書き出し)になっていないか?
    • work_mem の設定やインデックスでORDER BYを効率化する。

3. チューニングの手順(初心者向けフロー)

  1. 遅いSQLを探す

    • PostgreSQLの pg_stat_statements 拡張を使う。
    • ログで log_min_duration_statement を設定して、遅いクエリをログ出力。
  2. EXPLAIN ANALYZEで実行計画を確認

    EXPLAIN (ANALYZE, BUFFERS) SELECT ...;
    
  3. ボトルネックを見つける

    • Seq Scan が多い?
    • SortがTempファイルを使っている?
    • rows(予測)と actual rows(実測)がズレている?
  4. 改善策を試す

    • インデックスを追加
    • SQLを書き換える(サブクエリ→JOINなど)
    • 統計更新:ANALYZE
  5. 再テスト

    • どのくらい速くなったか確認する

4. よくある改善例

  • SELECT *をカラム指定に変更

    -- 悪い例
    SELECT * FROM users WHERE email = 'abc@example.com';
    
    -- 良い例
    SELECT id, name FROM users WHERE email = 'abc@example.com';
    
  • インデックスを作る

    CREATE INDEX idx_users_email ON users(email);
    
  • LIMITを活用して取得件数を減らす

    SELECT ... FROM ... ORDER BY created_at DESC LIMIT 50;
    

5. 初心者が意識すべき観点

  • 「DBは遅いSQL1つで全体が詰まる」

    • 頻繁に呼ばれるクエリを優先的に改善。
  • 「インデックスが効いているかを常に確認する」

    • EXPLAINを使って Seq Scan か Index Scan かを見る。
  • 「計測しないと良くなったか悪くなったかわからない」

    • 必ず BEFORE / AFTER を比較する。

6. まとめ

  • チューニングは“計測”から始まる
    遅いSQLを特定し、実行計画を確認してボトルネックを見つけることが最優先。

  • SQLの書き方とインデックスで大部分は改善できる
    まずは簡単な改善(SELECT *の削除、インデックス作成)から始めるとよいです。

  • 数字で効果を確認しながら改善する
    計測なしで「なんとなく直す」は危険です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?