【データベース】SQLチューニング - j-komatsu/myCheatSheet GitHub Wiki

SQLチューニング

1. はじめに

SQLチューニング(SQL Optimization)は、データベースのクエリ性能を向上させるための技術です。
適切なチューニングを行うことで、レスポンス速度を向上させ、システムの負荷を軽減できます。

2. SQLチューニングの基本概念

2.1 初学者向け解説

SQLチューニングとは、データベースに対する問い合わせ(SQLクエリ)の実行速度を向上させることです。
以下のような対策が一般的です。

対策 説明
インデックスを作成する データ検索を高速化するための仕組み
不要なデータ取得を避ける SELECT * を避け、必要なカラムのみ取得する
結合処理を最適化する JOIN を適切に使用し、インデックスを活用する
クエリの実行計画を確認する EXPLAIN コマンドを使用し、どのようにクエリが実行されるか分析する

2.2 専門者向け解説

SQLの最適化には、以下のような高度な手法があります。

技術 説明
カーディナリティの最適化 統計情報を利用し、クエリの選択率を向上
パーティショニング 大量データを効率的に分割し、検索を高速化
マテリアライズドビュー 頻繁に使用する結果をキャッシュ化し、高速に取得
クエリリライティング SQLをより効率的な形式に書き換える(例: EXISTS の利用)

3. SQLチューニングの流れ

flowchart TD
    A[パフォーマンス問題の特定] --> B[実行計画の分析]
    B --> C[ボトルネックの特定]
    C --> D{対策の選択}
    D -->|インデックス最適化| E[インデックス作成]
    D -->|クエリ最適化| F[SQLのリファクタリング]
    D -->|データベース設計| G[正規化・パーティショニング]
    E --> H[再評価]
    F --> H
    G --> H
    H --> A

4. インデックスの活用

4.1 インデックスの種類

インデックスの種類 説明
主キーインデックス テーブルの主キーに自動的に作成される
一意インデックス 一意性を保証しつつ検索を最適化
フルテキストインデックス テキスト検索の高速化
パーティションインデックス パーティショニングされたデータ用のインデックス

4.2 インデックスの使用例

-- 通常のインデックス
CREATE INDEX idx_user_name ON users(name);

-- ユニークインデックス
CREATE UNIQUE INDEX idx_email_unique ON users(email);

5. クエリの最適化

5.1 非効率なクエリ例

SELECT * FROM orders WHERE YEAR(order_date) = 2023;

問題点: YEAR(order_date) の計算が全件に適用され、インデックスが効かない。

5.2 最適化後のクエリ

SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31';

改善点: BETWEEN を使用することで、インデックスが有効に活用される。

6. 実行計画の分析

SQLの実行計画を分析することで、どのようにデータが処理されているかを把握できます。

6.1 実行計画の取得

EXPLAIN SELECT * FROM users WHERE email = '[email protected]';

6.2 実行計画の見方

カラム名 説明
id クエリのステップ番号
select_type クエリの種類(SIMPLE, SUBQUERYなど)
table 参照されるテーブル名
type 参照方法(ALL, INDEX, RANGE, REFなど)
key 使用されるインデックス
rows 予測される行数

7. まとめ

  • SQLチューニングの基本 を理解し、インデックスや最適なクエリの書き方を学ぶ。
  • 実行計画を分析 し、ボトルネックを特定する。
  • パフォーマンス向上のためのテクニック(インデックス、パーティショニング、マテリアライズドビューなど)を活用する。

このガイドを参考に、SQLの最適化を進めてみてください!