データベースのチューニングは、「なぜ遅いのか?」を見つけて「ムダを減らす」作業です。
ここでは初心者にもわかりやすく、チューニングの観点と手順を解説します。
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. チューニングの手順(初心者向けフロー)
-
遅いSQLを探す
- PostgreSQLの
pg_stat_statements
拡張を使う。 - ログで
log_min_duration_statement
を設定して、遅いクエリをログ出力。
- PostgreSQLの
-
EXPLAIN ANALYZEで実行計画を確認
EXPLAIN (ANALYZE, BUFFERS) SELECT ...;
-
ボトルネックを見つける
- Seq Scan が多い?
- SortがTempファイルを使っている?
- rows(予測)と actual rows(実測)がズレている?
-
改善策を試す
- インデックスを追加
- SQLを書き換える(サブクエリ→JOINなど)
- 統計更新:
ANALYZE
-
再テスト
- どのくらい速くなったか確認する
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 *
の削除、インデックス作成)から始めるとよいです。 -
数字で効果を確認しながら改善する
計測なしで「なんとなく直す」は危険です。